Cha*_*eus 2 c# file delete-file
我有一个包含文件路径列表的数据库.我想构建一个例程来清理文件夹,如果没有db记录,则删除目录中的文件(对于临时ajax文件上传,如果用户没有完成表单,等等).
我在想这样的事情:
var dbFiles = db.allPaths();
var allFiles = Directory.EnumerateFiles(path);
foreach (var f in allFiles) {
if (!dbFiles.Contains(f) {
File.Delete(f);
}
}
Run Code Online (Sandbox Code Playgroud)
任何"陷阱"都在等我?该例程将首先设置为每周运行一次,如果临时文件成为问题则更常见.它将在几乎没有用户的时间运行,因此性能 - 虽然重要 - 并不是最重要的.
UPDATE
哇,很多很棒的答案.这段代码正在变成值得"分享"的东西.; D我上面的代码只是一个简单,快速的占位符位...但它已转换为可靠的代码.谢谢!
看起来没问题,但你可以更简单:
foreach (var file in allFiles.Except(dbFiles))
{
File.Delete(file);
}
Run Code Online (Sandbox Code Playgroud)
您必须确保路径的格式完全相同.如果一个列表具有相对文件而另一个列表具有绝对文件,或者如果一个使用"/"而另一个使用"\",则最终会删除您不期望的内容.
理想情况下,您首先要显式地显示文件,但我看不到在.NET中获取规范文件名的好方法...
编辑:请注意,Path.GetFullPath这不是规范化的.它修复了斜杠并使其绝对,但它没有解决大小写:"c:/ users"变为"c:\ users",但"c:/ Users"变为"c:\ Users".
这可以通过在调用中使用字符串比较器来修复Except:
var dbFiles = db.AllPaths().Select(Path.GetFullPath));
var allFiles = Directory.EnumerateFiles(path).Select(Path.GetFullPath));
foreach (var file in allFiles.Except(dbFiles, StringComparer.OrdinalIgnoreCase))
{
File.Delete(file);
}
Run Code Online (Sandbox Code Playgroud)
现在这是无视案例 - 但是以"有序"的方式.我不知道Windows文件系统在区分大小写方面的确做了什么.
| 归档时间: |
|
| 查看次数: |
766 次 |
| 最近记录: |