FileInfo delete()方法不删除文件

时间:2016-05-04 12:48:00

标签: c#

我有这个功能来删除超过X个月的文件,但是当我运行代码时似乎没有删除它们:任何猜测为什么?当我检查文件夹时,它们仍在那里。

    public static void deleteFiles()
    {
        try
        {
            DirectoryInfo ddi = new DirectoryInfo(destination_path);
            if (ddi.Exists)
            {
                logFile.WriteLine("Log Entry: {0}", String.Format("{0:f}", dt) + System.Environment.NewLine);
                foreach (var filename in ddi.EnumerateFiles())
                {
                    FileInfo fi = new FileInfo(filename.ToString());//(destination_path + "\\" + filename);
                    if (fi.CreationTime < dt.AddMonths(-1) )
                    {
                        try
                        {
                            fi.Delete();
                            logFile.WriteLine("{0} was deleted successfully.", destination_path + "\\" + filename);
                        }
                        catch (Exception ex)
                        {
                            logFile.WriteLine("The deletion process failed: {0}", ex.Message);
                        }
                    }
                }
                logFile.WriteLine(String.Concat(Enumerable.Repeat("-------", 25)));
                logFile.WriteLine();
            }
        }
        catch (DirectoryNotFoundException ex)
        {
            logFile.WriteLine("Log Entry: {0}", String.Format("{0:f}", dt) + System.Environment.NewLine);
            logFile.WriteLine("Could not delete files from specified directory:  {0}", ex.Message);
            logFile.WriteLine(String.Concat(Enumerable.Repeat("-------", 25)));
            logFile.WriteLine();
        }

    }

3 个答案:

答案 0 :(得分:4)

As&#34; Alessandro D&#39; Andria&#34;指出文档说:

https://msdn.microsoft.com/en-us/library/system.io.fileinfo.delete(v=vs.110).aspx

&#34;如果文件不存在,则此方法不执行任何操作。&#34;

这使您认为文件删除已经起作用并且正在掩盖问题。

如果你看一下这条线:

foreach (var filename in ddi.EnumerateFiles())

这将返回一个FileInfo对象,该对象基本上是指向要删除的文件的链接。

但是下一行,根据文件名创建一个新的FileInfo对象。

FileInfo fi = new FileInfo(filename.ToString());

但是filename.ToString()只是返回文件名,这里没有路径信息。

如果您运行调试器,您将看到fi对象将具有不是您的destination_path的路径名(fi.Directory),但实际上是您正在运行的可执行文件的路径。

因此,fi.Delete()实际上并没有找到该文件,所以它什么都不做(根据文档),但你仍然写了一个成功的&#39;消息到你的日志文件并没有抛出异常,所以你错误地认为一切都有效。

所以你真的想要更像这样的东西;

if (filename.CreationTime < dt.AddMonths(-1))
{
    try
    {
        if (!filename.Exists)
            throw new Exception("File does not exist");

        filename.Delete();
        WriteLine("{0} was deleted successfully.", destination_path + "\\" + filename);
    }
    catch (Exception ex)
    {
        WriteLine("The deletion process failed: {0}", ex.Message);
    }
}

答案 1 :(得分:0)

尝试使用完整路径:

string path = Path.Combine(destination_path,filename.ToString());
FileInfo fi = new FileInfo(path);

答案 2 :(得分:0)

尝试类似的东西....(我遗漏了你的一些逻辑,但原理是相同的......) 就我所见,你不需要使用fileinfo。

{
        string[] files = Directory.GetFiles(destination_path);

        foreach (string filename in files)
        {
            if (File.Exists(destination_path + "\\" + filename))
            {
                try
                {
                    File.Delete(destination_path + "\\" + filename);

                }
                catch (Exception ex)
                {
                    logFile.WriteLine("The deletion process failed: {0}", ex.Message);
                }
            }
        }
    }