如何防止从当前处于打开状态的解决方案的AppDomain.CurrentDomain中创建的临时文件夹中删除文件。 我想只删除未使用的文件.. 我试过这个..
public void TempDocumentDeletion()
{
string curUserFolder = AppDomain.CurrentDomain.GetData("DataDirectory") + "\\temp" + "\\" + CurrentUserData.UserId;
DirectoryInfo curdir = new System.IO.DirectoryInfo(curUserFolder);
foreach (FileInfo files in curdir.GetFiles())
{
var fullName = files.FullName;
if (!IsFileLocked(fullName))
{
files.Delete();
}
}
public static bool IsFileLocked(string filePath)
{
var file = new FileInfo(filePath);
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
// still being written to or being processed by another thread
return true;
}
finally
{
if (stream != null)
stream.Close();
}
// file is not locked
return false;
}
但有时,使用过的文件也会被删除...是否有其他方法可以解决...或者需要进行任何修改。
答案 0 :(得分:0)
正如我解释的那样,问题基本上是:
如何检查文件是否被锁定,这意味着:我不应该尝试删除它
所以问题中的方法将用作:
if(!IsFileLocked(path))
File.Delete(path);
问题在于:你立刻遇到了竞争条件。事情可以在IsFileLocked
支票和File.Delete
之间(任一方向)发生变化。这些更改可能与您的应用程序有关,也可能与您的应用程序无关(可能是锁定文件的另一个进程)。
所以:在一般情况下:你不能。您需要期望 File.Delete
可能会失败,并适当地处理异常。在最基本的层面:
try {
File.Delete(path);
} catch (Exception ex) {
Log($"could not delete file {path}: {ex.Message}");
}
(显然,如果你能改进这种处理方式:很棒)
如果你只做偶尔的文件工作,说实话:这可能是如何离开它,因为你需要 ,它解决了你遇到的每一个问题。
如果您执行了大量文件IO,您可能需要考虑一个内存文件注册表来跟踪您的代码已打开的文件对象,因此您知道哪些文件对象不会尝试删除。这本身就有很多线程问题并且不是微不足道的,和它无法帮助处理文件的其他进程,所以你仍然需要“expect {{1失败“处理。但是,当消费代码完成时,您还可以使文件注册表本身可以删除文件。