当我执行下面的代码时,我得到了常见的异常The process cannot access the file *filePath* because it is being used by another process
。
允许此线程等待直到可以安全访问此文件的最有效方法是什么?
假设:
该文件是我刚刚创建的,因此不太可能有另一个应用程序正在访问它。
我的应用程序中有多个线程可能正在尝试运行此代码以将文本追加到文件中。
:
using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
到目前为止,我想出的最好的方法是以下方法。这样做有不利之处吗?
private static void WriteToFile(string filePath, string text, int retries)
{
const int maxRetries = 10;
try
{
using (var fs = File.Open(filePath, FileMode.Append))
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
}
catch (IOException)
{
if (retries < maxRetries)
{
Thread.Sleep(1);
WriteToFile(filePath, text, retries + 1);
}
else
{
throw new Exception("Max retries reached.");
}
}
}
参考方案
如果有多个线程尝试访问同一文件,请考虑使用锁定机制。最简单的形式可能是:
lock(someSharedObject)
{
using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
}
作为替代方案,请考虑:
File.AppendText(text);
Java中的多线程 - java如果我的文件包含4000字节,我可以同时从文件读取4个线程吗?并且每个线程访问文件的不同部分。线程1读取0-999,线程2读取1000-2999,依此类推。请用Java举例。 参考方案 该文件非常小,并且加载速度非常快。我要做的是创建一个加载数据的线程安全数据类。然后,每个处理线程都可以从数据类中请求一个ID,并接收一个唯一的线程,并保证没有其他线程向您的远…
File.Exists是否不能在UWP项目中使用? - c#File.Exists(filePath);在控制台应用程序中可以完美地工作,但是当我在uwp中执行相同的操作时,它不会检测到文件。我试图在各种方法上设置断点,并尝试任何可以为我提供有关此问题的信息的方法,但是无论我尝试什么,我都一无所获。来自UWP应用的代码: string path = @"C:\Users\Name\Desktop\image…
jQuery File Upload插件-空文件上传结果 - php在过去的几天里,我一直在使用this插件进行自定义,并将其设置为可以完全按照我的站点要求工作。我在本地服务器上一切正常,没有错误/错误。但是,当我尝试将其上传到我的Plesk服务器时,没有文件显示在加载状态(即使目标文件夹中有图像),并且当我尝试上传im时,出现“空文件上传结果”错误。奇怪的是,即使显示了错误,文件上传似乎仍然起作用,并且相关的图像出现在文件…
获取PHP中函数调用者的__FILE__常量 - php我知道PHP中的__FILE__魔术常数将变成当前执行文件的完整路径和文件名。但是,有什么方法可以使函数的调用文件获得相同的信息吗?例如://foo.php: include "bar.php"; call_it(); //bar.php function call_it() { echo "Calling file: …
如何在PHP中设置get_file_contents的时间限制? - php有时get_file_contents花费的时间太长,这会挂起整个脚本。有什么方法可以设置get_file_contents的超时限制,而无需修改脚本的最大执行时间?编辑:由于该文件不存在,因此花费了很长时间。我收到“无法打开流:HTTP请求失败!”错误。但这需要永远。 参考方案 通过使用timeout option创建上下文,似乎在PHP> 5.2.…