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

如果达到该代码,它将始终删除您的文件,除非您将来创建它们,或者在您的框中输入负数。


不过,您还有其他一些麻烦。一旦你开始删除目录,你会因为两个原因而点击例外,我可以立即看到。

  1. 一旦删除了子目录的包含目录,您就不会检查子目录是否仍然存在。如果您删除c:\myFiles然后您的代码接下来检查c:\myFiles\other,您将遇到错误,因为您的代码将尝试检查不存在的目录上的属性。你应该先检查Directory.Exists()

  2. 除非目录为空,否则您的目录删除代码将不起作用。bool您需要传递第二个参数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 回答