我有这个功能来删除超过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();
}
}
答案 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);
}
}
}
}