5

質問:(ユーザーがダウンロードするための)一時PDFファイルを作成するASP.NETアプリケーションがあります。現在、多くのユーザーが何日にもわたって多くのPDFを作成でき、多くのディスク容量を消費します。

1日/8時間より古いファイルの削除をスケジュールする最良の方法は何ですか?できれば、asp.netアプリケーション自体で...

4

8 に答える 8

6

作成する必要のある一時ファイルごとに、セッションのファイル名をメモします。

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

次に、次のクリーンアップコードを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>

更新:私は現在、上記の方法よりも新しい(改善された)方法を実際に使用しています。新しいものには、HttpRuntime.Cacheと、ファイルが8時間以上経過していることの確認が含まれます。興味のある方はこちらに投稿します。これが私の新しい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();
            }
        });
    }
}
于 2010-05-17T12:22:46.273 に答える
1

を使用してみてくださいPath.GetTempPath()。それはあなたにウィンドウズ一時フォルダへのパスを与えるでしょう。その後、クリーンアップするのはウィンドウ次第です:)

この方法の詳細については、http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspxを参照してください。

于 2010-05-14T09:25:11.900 に答える
1

最良の方法は、必要な間隔でWindowsタスクスケジューラによって呼び出されるバッチファイルを作成することです。

また

上記のクラスでWindowsサービスを作成できます

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)

}

}

このクラスはpageLoadでも呼び出すことができ、処理は別のスレッドで行われるため、処理時間には影響しません。do-whileとThread.Join()を削除するだけです。

于 2010-05-18T18:49:10.187 に答える
0

ファイルをどのように保存しますか?可能であれば、すべてのファイルが現在の日時にちなんで名付けられたフォルダーに保存されるという単純な解決策を使用することもできます。
次に、古いフォルダを削除する単純なページまたはhttphandlerを作成します。このページは、Windowsスケジュールまたはその他のcronジョブを使用して定期的に呼び出すことができます。

于 2010-05-14T09:46:08.083 に答える
0

Appication_Startでタイマーを作成し、1時間ごとにメソッドを呼び出すようにタイマーをスケジュールし、8時間または1日、あるいは必要な期間より古いファイルをフラッシュします。

于 2010-05-17T12:25:54.363 に答える
0

私はdirkの答えで言ったことにある程度同意します。

ファイルをドロップする一時フォルダは固定された既知の場所であるという考えですが、私はわずかに異なります...

  1. ファイルが作成されるたびに、セッションオブジェクトのリストにファイル名を追加します(このリストが特定の上限に達したときに数千がない場合は、次のビットを実行します)

  2. セッションが終了すると、global.asaxでSession_Endイベントが発生する必要があります。リスト内のすべてのファイルを繰り返し、それらを削除します。

于 2010-05-17T14:15:00.973 に答える
0
    private const string TEMPDIRPATH = @"C:\\mytempdir\";
    private const int DELETEAFTERHOURS = 8;

    private void cleanTempDir()
    {
        foreach (string filePath in Directory.GetFiles(TEMPDIRPATH))
        {
            FileInfo fi = new FileInfo(filePath);
            if (!(fi.LastWriteTime.CompareTo(DateTime.Now.AddHours(DELETEAFTERHOURS * -1)) <= 0)) //created or modified more than x hours ago? if not, continue to the next file
            {
                continue;
            }

            try
            {
                File.Delete(filePath);
            }
            catch (Exception)
            {
                //something happened and the file probably isn't deleted. the next time give it another shot
            }
        }
    }

上記のコードは、8時間以上前に作成または変更された一時ディレクトリ内のファイルを削除します。

ただし、別のアプローチを使用することをお勧めします。Fredrik Johanssonが提案したように、セッションの終了時にユーザーが作成したファイルを削除できます。一時ディレクトリ内のユーザーのセッションIDに基づいて追加のディレクトリを操作することをお勧めします。セッションが終了したら、ユーザー用に作成されたディレクトリを削除するだけです。

    private const string TEMPDIRPATH = @"C:\\mytempdir\";
    string tempDirUserPath = Path.Combine(TEMPDIRPATH, HttpContext.Current.User.Identity.Name);
    private void removeTempDirUser(string path)
    {
        try
        {
            Directory.Delete(path);
        }
        catch (Exception)
        {
            //an exception occured while deleting the directory.
        }
    }
于 2010-05-17T14:44:26.423 に答える
0

キャッシュの有効期限通知を使用して、ファイルの削除をトリガーします。

    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);
    }

参照:MSDN | 方法:アイテムがキャッシュから削除されたときにアプリケーションに通知する

于 2012-04-25T14:22:28.387 に答える