研究了很多关于这个例外的话题,没有运气。我的简单代码:
string t = Path.GetTempFileName();
t = t.Remove(t.Length - 11, 11);
var q = Directory.EnumerateFiles(t, "tmp????.tmp");
var f = q.ToList();
for (int i = 0; i < q.Count(); i++)
{
// if (Helper.CanReadFile(f[i]))
try
{
File.Delete(f[i]);
}
catch (IOException)
{
break;
}
}
我在主窗口的Closing事件中运行了此代码。 所以它删除了几个文件,进入异常,然后到#34; break&#34;声明,然后......某处。只是冻结和暂停调试器导致什么都没有。我尝试了几段代码来查找文件是否在删除之前使用,但它在此代码中得到一个异常(如Helper.CanReadFile)并暂停程序流。 我真的不必删除所有文件,但我需要停止冻结。我如何使用此异常以便不冻结我的程序?
使用断点和大多数信息进行编辑。
1)得到例外http://imgur.com/a/k6of3
2)从它开始的第一步,没有多少http://imgur.com/a/FvWjz
3)回去处置http://imgur.com/a/LMdiA
4)回到事件方法http://imgur.com/a/FlIUf
5)来自onclose http://imgur.com/a/YQUrZ
6)之后它会在这里循环一段时间(我使用全局热键)http://imgur.com/a/0qjdf它会在~10循环后消失,msg = 130.如果删除文件删除部分,我的程序会正常关闭。
7)冻结部分(没有代码正在运行消息)http://imgur.com/a/WeEGj
答案 0 :(得分:0)
删除文件时,您可以尝试:
要在后台线程上运行此代码,您可以执行以下操作:
更改为private async Task DeleteAllTempFiles()
并将其命名为,不等待!
或强>
new Thread(() => { DeleteAllTempFiles(); }).Start();
private void DeleteAllTempFiles()
{
try
{
//Get the temp Path
DirectoryInfo tempDir = new DirectoryInfo(Path.GetTempPath());
//Get all matching files
List<FileInfo> tempFiles = tempDir.GetFiles("tmp????.tmp", SearchOption.AllDirectories).ToList();
//Collect all files that fail to delete
List<FileInfo> cannotDelete = new List<FileInfo>();
//Delete Files:
DeleteFiles(tempFiles, out cannotDelete);
//Show what failed (and retry or whatever)
string message = "Cannot delete the following file(s):";
cannotDelete.ForEach(file => message += "{file.FullName}{Environment.NewLine}");
MessageBox.Show(message, "Result");
}
catch (Exception ex)
{
Debug.Fail(ex.Message);
}
}
private void DeleteFiles(List<FileInfo> filesToDelete, out List<FileInfo> failedToDelete)
{
foreach(FileInfo file in filesToDelete)
{
try
{
file.Delete();
}
catch (IOException ioEx)
{
failedToDelete?.Add(file); //<-- Check if failedToDelete != null !!!
//This will always happen.
//Since its not "hard fail" you should log it but keep goin !
//MessageBox.Show($"IO-Exception: {ioEx.Message}");
}
catch (Exception ex)
{
MessageBox.Show($"Exception: {ex.Message}");
}
}
}
如果您要使用无法删除的文件,可以使用以下文件进行处理:How do I find out which process is locking a file using .NET?
要快速检查锁定文件的内容,您可以使用OpenedFilesView或Windows Sysinternals Process Explorer
也许您可以尝试设置一些属性......也许您可以通过此访问:
很抱歉图片尺寸不合适..