C# 不同编译模式下的奇怪bug

C# 不同编译模式下的奇怪bug,c#,debugging,compilation,release,fileinfo,C#,Debugging,Compilation,Release,Fileinfo,我遇到了一个非常奇怪的bug,它只在以发布模式编译时出现,而在调试模式下,代码运行得非常完美。此外,只有在用户报告的一台机器上遇到该错误 这是堆栈跟踪: System.IO.FileNotFoundException:找不到文件“C:\Users…\FileName.txt”。 文件名:“C:\Users…\FileName.txt” 在System.IO.\uuu Error.WinIOErrorInt32 errorCode中,字符串可能是完整路径 在System.IO.FileInfo.g

我遇到了一个非常奇怪的bug,它只在以发布模式编译时出现,而在调试模式下,代码运行得非常完美。此外,只有在用户报告的一台机器上遇到该错误

这是堆栈跟踪:

System.IO.FileNotFoundException:找不到文件“C:\Users…\FileName.txt”。 文件名:“C:\Users…\FileName.txt” 在System.IO.\uuu Error.WinIOErrorInt32 errorCode中,字符串可能是完整路径 在System.IO.FileInfo.get_长度中 在PatcherNET4.FileHandler.LocalFile.get\u Size中 在PatcherNET4.FileHandler.CachedFile.IsLocalValidLocalFile文件中 在PatcherNET4.FileHandler.FileManager.c__显示classd.b__9CachedFile文件中 在System.Linq.Enumerable.FirstOrDefault[TSource]IEnumerable1源中,Func2谓词 在PatcherNET4.FileHandler.FileManager.RemoveLocalFiles中 在PatcherNET4.FileHandler.FileManager.DownloadMissingFiles中 处于System.Threading.ThreadHelper.ThreadStart_ContextObject状态 在System.Threading.ExecutionContext.RunInternalExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx中 在System.Threading.ExecutionContext.RunExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx中 在System.Threading.ExecutionContext.RunExecutionContext 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;
    }
}
...

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

将FileName.txt放入“找不到文件”C:\Users…\here目录

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

if (!File.Exists(fileName))
{
    // do something
}
如果文件不存在,我相信你说它丢失了,然后考虑其他的选择。文件已经被删除了吗?我注意到stacktrace中有RemoveLocalFiles,所以它可能已经运行过了。可能用户按了两次按钮?比赛条件。独立线程?用户已登录到两台计算机并具有漫游配置文件。或者类似的


不管它是否是一个bug,最好是防御性的,包括一个检查,以确保文件存在,或者捕获异常(如果您喜欢的话)。

那么C:\Users…\FileName.txt是否存在于该计算机上?路径是否相对?在debug/release中运行时,程序的运行目录将不同。是,它存在;此外,错误发生在两个不同运行模式下的两个不同文件上。仅取决于编译模式的错误闻起来像是运行状态。@tnw:是的,这是相对的。谢谢这一点,我明天会试试。但是,当200多人在使用它时,怎么可能只在一台机器上遇到这个错误呢?例如,SJuan?@LightStyle检查文件名brother System.IO.FileNotFoundException已执行。我没那么笨,别担心。文件在那里,程序无法识别它。我还认为这可能是路径的问题,它里面有一个空间,我让用户更改了它,但它也不起作用。嗯,这是可能的。但是你如何解释这个愚蠢的程序在200多台机器上工作而没有错误,并且它不只是在一台机器上的发布模式下工作?这是可能的。但我还不能解释同一个程序在调试和发布模式下可能有什么不同。@LightStyle如果在调试模式下使用当前目录…在发布模式下应该使用绝对位置…好吗