ASP.NET Schedule deletion of temporary files

前端 未结 8 1014
暗喜
暗喜 2021-01-06 00:38

Question: I have an ASP.NET application which creates temporary PDF files (for the user to download). Now, many users over many days can create many PDFs, which take much di

相关标签:
8条回答
  • 2021-01-06 01:08

    I sort of agree with whats said in the answer by dirk.

    The idea being that the temp folder in which you drop the files to is a fixed known location however i differ slightly ...

    1. Each time a file is created add the filename to a list in the session object (assuming there isn't thousands, if there is when this list hits a given cap do the next bit)

    2. when the session ends the Session_End event should be raised in global.asax should be raised. Iterate all the files in the list and remove them.

    0 讨论(0)
  • 2021-01-06 01:10

    The Best way is to create a batch file which it be called by the windows task scheduler one at the interval that you want.

    OR

    you can create a windows service with the class above

    public class CleanUpBot
    {
    
    public bool KeepAlive;
    
    private Thread _cleanUpThread;
    
    public void Run()
    {
    
    _cleanUpThread = new Thread(StartCleanUp);
    
    }
    
    private void StartCleanUp()
    {
    
    do
    
    {
    
    // HERE THE LOGIC FOR DELETE FILES
    
    _cleanUpThread.Join(TIME_IN_MILLISECOND);
    
    }while(KeepAlive)
    
    }
    
    }
    

    Notice that you can also call this class at the pageLoad and it wont affect the process time because the treatment is in another thread. Just remove the do-while and the Thread.Join().

    0 讨论(0)
  • 2021-01-06 01:11

    How do you store the files? If possible, you could just go with a simple solution, where all files are stored in a folder named after the current date and time.
    Then create a simple page or httphandler that will delete old folders. You could call this page at intervals using a Windows schedule or other cron job.

    0 讨论(0)
  • 2021-01-06 01:18

    Try using Path.GetTempPath(). It will give you a path to a windows temp folder. Then it will be up to windows to clean up :)

    You can read more about the method here http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspx

    0 讨论(0)
  • 2021-01-06 01:27

    Use the cache expiry notification to trigger file deletion:

        private static void DeleteLater(string path)
        {
            HttpContext.Current.Cache.Add(path, path, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 8, 0, 0), CacheItemPriority.NotRemovable, UploadedFileCacheCallback);
        }
    
        private static void UploadedFileCacheCallback(string key, object value, CacheItemRemovedReason reason)
        {
            var path = (string) value;
            Debug.WriteLine(string.Format("Deleting upladed file '{0}'", path));
            File.Delete(path);
        }
    

    ref: MSDN | How to: Notify an Application When an Item Is Removed from the Cache

    0 讨论(0)
  • For each temporary file that you need to create, make a note of the filename in the session:

    // create temporary file:
    string fileName = System.IO.Path.GetTempFileName();
    Session[string.Concat("temporaryFile", Guid.NewGuid().ToString("d"))] = fileName;
    // TODO: write to file
    

    Next, add the following cleanup code to global.asax:

    <%@ Application Language="C#" %>
    <script RunAt="server">
        void Session_End(object sender, EventArgs e) {
            // Code that runs when a session ends. 
            // Note: The Session_End event is raised only when the sessionstate mode
            // is set to InProc in the Web.config file. If session mode is set to StateServer 
            // or SQLServer, the event is not raised.
    
            // remove files that has been uploaded, but not actively 'saved' or 'canceled' by the user
            foreach (string key in Session.Keys) {
                if (key.StartsWith("temporaryFile", StringComparison.OrdinalIgnoreCase)) {
                    try {
                        string fileName = (string)Session[key];
                        Session[key] = string.Empty;
                        if ((fileName.Length > 0) && (System.IO.File.Exists(fileName))) {
                            System.IO.File.Delete(fileName);
                        }
                    } catch (Exception) { }
                }
            }
    
        }       
    </script>
    

    UPDATE: I'm now accually using a new (improved) method than the one described above. The new one involves HttpRuntime.Cache and checking that the files are older than 8 hours. I'll post it here if anyones interested. Here's my new global.asax.cs:

    using System;
    using System.Web;
    using System.Text;
    using System.IO;
    using System.Xml;
    using System.Web.Caching;
    
    public partial class global : System.Web.HttpApplication {
        protected void Application_Start() {
            RemoveTemporaryFiles();
            RemoveTemporaryFilesSchedule();
        }
    
        public void RemoveTemporaryFiles() {
            string pathTemp = "d:\\uploads\\";
            if ((pathTemp.Length > 0) && (Directory.Exists(pathTemp))) {
                foreach (string file in Directory.GetFiles(pathTemp)) {
                    try {
                        FileInfo fi = new FileInfo(file);
                        if (fi.CreationTime < DateTime.Now.AddHours(-8)) {
                            File.Delete(file);
                        }
                    } catch (Exception) { }
                }
            }
        }
    
        public void RemoveTemporaryFilesSchedule() {
            HttpRuntime.Cache.Insert("RemoveTemporaryFiles", string.Empty, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, delegate(string id, object o, CacheItemRemovedReason cirr) {
                if (id.Equals("RemoveTemporaryFiles", StringComparison.OrdinalIgnoreCase)) {
                    RemoveTemporaryFiles();
                    RemoveTemporaryFilesSchedule();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题