不同编译模式中的奇怪错误

时间:2014-04-14 19:52:10

标签: c# debugging compilation release fileinfo

我遇到了一个非常奇怪的错误,只有在 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;
    }
}
...

这怎么可能?我可以向您保证,在发布和调试模式之间,感兴趣的代码片段没有区别。我真的不知道该怎么做,这可能是我见过的最奇怪的错误。

2 个答案:

答案 0 :(得分:0)

FileName.txt 放入无法找到文件' C:\ Users ... \(此处)目录

答案 1 :(得分:0)

我尝试的第一件事是在运行时验证文件是否存在并从那里开始。

if (!File.Exists(fileName))
{
    // do something
}

如果文件不存在(我相信你,当你说它缺失时),那么考虑替代方案。该文件已被删除吗?我在stacktrace中注意到了RemoveLocalFiles,所以也许它已经运行了。也许用户按了两次按钮?竞争条件。单独的线程?用户登录两台计算机并具有漫游配置文件。或类似的东西。

无论是否存在错误,最好采取防御措施并包括检查以确保文件存在(或者如果您愿意,可以捕获例外情况)。< / p>