在一个文件被解锁并且可以读取和重命名之前,阻止线程的最简单方法是什么?例如,列表中的某个地方是否有一个WaitOnFile().NET框架?

我有一个服务,它使用FileSystemWatcher查找要传输到FTP站点的文件,但在另一个进程完成文件写入之前,file created事件就会触发.

理想的解决方案是有一个超时时间,这样线程在放弃之前不会永远挂起.

编辑:在try 了下面的一些解决方案后,我最终更改了system,以便所有文件都写入Path.GetTempFileName(),然后执行File.Move()到最终位置.FileSystemWatcher事件一激发,文件就已经完成.

推荐答案

这是我在related question上给出的答案:

    /// <summary>
    /// Blocks until the file is not locked any more.
    /// </summary>
    /// <param name="fullPath"></param>
    bool WaitForFile(string fullPath)
    {
        int numTries = 0;
        while (true)
        {
            ++numTries;
            try
            {
                // Attempt to open the file exclusively.
                using (FileStream fs = new FileStream(fullPath,
                    FileMode.Open, FileAccess.ReadWrite, 
                    FileShare.None, 100))
                {
                    fs.ReadByte();

                    // If we got this far the file is ready
                    break;
                }
            }
            catch (Exception ex)
            {
                Log.LogWarning(
                   "WaitForFile {0} failed to get an exclusive lock: {1}", 
                    fullPath, ex.ToString());

                if (numTries > 10)
                {
                    Log.LogWarning(
                        "WaitForFile {0} giving up after 10 tries", 
                        fullPath);
                    return false;
                }

                // Wait for the lock to be released
                System.Threading.Thread.Sleep(500);
            }
        }

        Log.LogTrace("WaitForFile {0} returning true after {1} tries",
            fullPath, numTries);
        return true;
    }

.net相关问答推荐

如何在AutoMapper中添加自定义方法到项目中?

在平板电脑上运行我的 Angular 13 和 .Net Api 项目时,它不会向 api 输入请求

如果只有一个 : 存在于字符串中,则提取冒号后的内容

StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

.NET - WindowStyle = hidden 与 CreateNoWindow = true?

在 .NET 中获取执行 exe 路径的最佳方法是什么?

[DllImport("QCall")] 是什么?

C# 的 Actors 有什么好的实现吗?

NuGetPackageImportStamp 有什么用?

什么版本的 .NET 附带什么版本的 Windows?

如何使用 Android 使用 WCF 服务

从 Windows 窗体打开 URL

在 .NET 中查找下一个 TCP 端口

迭代器和枚举器的区别

有没有办法从方法返回匿名类型?

string.Empty vs null.你用哪一个?

为什么 double.NaN 不等于自身?

EF Core 添加迁移构建失败

安装带有恢复操作的 Windows 服务以重新启动

为什么 .NET 中没有 Tree 类?