0

トピックが言うように、これが私のコードです。

public void deleteOldShit()
{
String path = textBox1.Text ;
Int32 days = Convert.ToInt32(oldRelease.Text);
Int32 neededSpace = Convert.ToInt32(discSpace.Text);
String[] folders = Directory.GetDirectories(path, "*".ToString(), SearchOption.AllDirectories);

foreach (String folder in folders)
{

    DirectoryInfo source = new DirectoryInfo(folder);
    String k = Directory.GetDirectoryRoot(path);
    k = k.Replace(@":\", "");
    DriveInfo c = new DriveInfo(k);
    Double cAvailableSpace = c.AvailableFreeSpace / Math.Pow(1024, 2);


    // Get info of each file into the directory
    foreach (DirectoryInfo fi in source.GetDirectories())
    {
        var creationTime = fi.CreationTime;

        if (creationTime < (DateTime.Now - new TimeSpan(days, 0, 0, 0)))
        {
            if (cAvailableSpace < neededSpace)
            {
                    Directory.Delete(folder,true);
            }
        }
    }
}
}

x日後にファイルを削除することを見てきましたが、日付/時刻の比較はバグのようです.

ここでのポインタはクールです。これに対する答えが見つからないようです。

4

2 に答える 2

1

私の推測では、この行は期待どおりに機能していません。

if (creationTime < (DateTime.Now - new TimeSpan(90, 0, 0, 0)))

その行は、フォルダが90日以上前に作成されていない限り、フォルダの削除を妨げています。また、実際の「X日」コードも間違っているようです(おそらく到達していませんが)

if (fi.CreationTime < DateTime.Now.AddDays(days))

そのコードに到達した場合、将来ファイルを作成するか、ボックスに負の数を入力しない限り、ファイルは常に削除されます。


ただし、ここでは他にも問題があります。ディレクトリの削除を開始すると、すぐにわかる2つの理由で例外が発生します。

  1. サブディレクトリを含むディレクトリを削除した後も、サブディレクトリがまだ存在することを確認していません。削除c:\myFilesしてからコードが次にチェックするc:\myFiles\other場合、コードは存在しないディレクトリのプロパティをチェックしようとするため、エラーが発生します。Directory.Exists()最初に確認する必要があります。

  2. ディレクトリが空でない限り、ディレクトリ削除コードは機能しません。そこに含まれているファイルとフォルダーを削除するためにbool渡す必要のある2番目のパラメーターがあります。true


最後に、必ず言及してください。コードは、危険なディレクトリに入っていないことを実際にチェックしないので、これに注意してください。:)

于 2012-04-26T21:35:18.743 に答える
0

間違ったディレクトリを削除しようとしていると思います:

    foreach (String folder in folders)
    {

        DirectoryInfo source = new DirectoryInfo(folder);
        String k = Directory.GetDirectoryRoot(path);
        k = k.Replace(@":\", "");
        DriveInfo c = new DriveInfo(k);
        Double cAvailableSpace = c.AvailableFreeSpace / Math.Pow(1024, 2);


        // Get info of each file into the directory
        foreach (DirectoryInfo fi in source.GetDirectories())
        {
            var creationTime = fi.CreationTime;

            if (creationTime < (DateTime.Now - new TimeSpan(days, 0, 0, 0)))
            {
                if (cAvailableSpace < neededSpace)
                {
                        **/* Trying to delete Folder, but should be FI.Fullname */**

                    try
                       {
                        Directory.Delete(folder,true);
                       }
                    catch(Exception e)
                       {
Console.WriteLine("The process failed: {0}", e.ToString());
                       }
                }
            }
        }
    }
    }
于 2012-04-26T21:57:24.273 に答える