我遇到了一个非常奇怪的错误,只有在 Release 模式下编译时才出现,而在 Debug 模式下,代码运行完美。此外,只在一台机器上遇到错误(用户报告了这一点)。
这是堆栈跟踪:
System.IO.FileNotFoundException:无法找到文件' C:\ Users ... \ FileName.txt'。 文件名:' C:\ Users ... \ FileName.txt' 在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath) 在System.IO.FileInfo.get_Length()中 在PatcherNET4.FileHandler.LocalFile.get_Size()中 在PatcherNET4.FileHandler.CachedFile.IsLocalValid(LocalFile文件)中 在PatcherNET4.FileHandler.FileManager中。<> c__DisplayClassd.b__9(CachedFile文件) 在System.Linq.Enumerable.FirstOrDefault [TSource]中(IEnumerable
中1 source, Func
2谓词) 在PatcherNET4.FileHandler.FileManager.RemoveLocalFiles()中 在PatcherNET4.FileHandler.FileManager.DownloadMissingFiles()中 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)中 在System.Threading.ExecutionContext.RunInternal中(ExecutionContext executionContext,ContextCallback回调,Object状态,Boolean preserveSyncCtx) 在System.Threading.ExecutionContext.Run中(ExecutionContext executionContext,ContextCallback回调,Object状态,Boolean preserveSyncCtx) 在System.Threading.ExecutionContext.Run中(ExecutionContext executionContext,ContextCallback回调,对象状态) 在System.Threading.ThreadHelper.ThreadStart()
这是代码:
// CachedFile
...
public bool IsLocalValid(LocalFile file)
{
var checkName = file.Name == Name;
var checkSize = file.Size == Size;
var checkLastWrite = file.LastWriteTime == LastWriteTime;
return checkName && checkSize && checkLastWrite;
}
...
//LocalFile
...
public uint Size
{
get
{
_info.Refresh();
return (uint)_info.Length;
}
}
...
这怎么可能?我可以向您保证,在发布和调试模式之间,感兴趣的代码片段没有区别。我真的不知道该怎么做,这可能是我见过的最奇怪的错误。
答案 0 :(得分:0)
将 FileName.txt 放入无法找到文件' C:\ Users ... \(此处)目录
答案 1 :(得分:0)
我尝试的第一件事是在运行时验证文件是否存在并从那里开始。
if (!File.Exists(fileName))
{
// do something
}
如果文件不存在(我相信你,当你说它缺失时),那么考虑替代方案。该文件已被删除吗?我在stacktrace中注意到了RemoveLocalFiles,所以也许它已经运行了。也许用户按了两次按钮?竞争条件。单独的线程?用户登录两台计算机并具有漫游配置文件。或类似的东西。
无论是否存在错误,最好采取防御措施并包括检查以确保文件存在(或者如果您愿意,可以捕获例外情况)。< / p>