如何锁定文件
回答
只要以独占方式打开它:
using (FileStream fs =
File.Open("MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
// use fs
}
Ref。
更新:作为对来自海报的评论的回应:根据在线MSDN doco,在.Net Compact Framework 1.0和2.0中支持File.Open。
而当你在它,使确保你不会失去参考和延迟解锁,直到GC非确定性地释放它 - 使用IDisposable接口,例如通过将上述语句包装在'using'块中。 – 2009-09-16 10:07:32
不知道这回答了这个问题。 OP正在寻找紧凑框架中不存在的FileStream.Lock方法。锁可以防止其他进程修改文件,但仍然让他们读取它。我认为你的方法会完全阻止其他进程。 – MusiGenesis 2009-09-16 10:32:28
@MusiGenesis:海报似乎在问如何锁定文件... – 2009-09-16 10:34:17
这相当于米奇的答案,只是它似乎在更多版本的.Net中可用。唯一重要的论点是FileShare.None
;其他人可以使构造函数的重载,但他们的价值取决于你将如何使用流。
using(var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)
{
// ...
}
如果另一个线程试图访问文件,FileShare.None会抛出“System.IO.IOException”错误。
你可以使用一些使用try/catch的函数来等待文件被释放。示例here。
或者你可以访问写函数之前使用lock语句与一些“虚拟”变量:
// The Dummy Lock
public static List<int> DummyLock = new List<int>();
static void Main(string[] args)
{
MultipleFileWriting();
Console.ReadLine();
}
// Create two threads
private static void MultipleFileWriting()
{
BackgroundWorker thread1 = new BackgroundWorker();
BackgroundWorker thread2 = new BackgroundWorker();
thread1.DoWork += Thread1_DoWork;
thread2.DoWork += Thread2_DoWork;
thread1.RunWorkerAsync();
thread2.RunWorkerAsync();
}
// Thread 1 writes to file (and also to console)
private static void Thread1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 20; i++)
{
lock (DummyLock)
{
Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 3");
AddLog(1);
}
}
}
// Thread 2 writes to file (and also to console)
private static void Thread2_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 20; i++)
{
lock (DummyLock)
{
Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 4");
AddLog(2);
}
}
}
private static void AddLog(int num)
{
string logFile = Path.Combine(Environment.CurrentDirectory, "Log.txt");
string timestamp = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
using (FileStream fs = new FileStream(logFile, FileMode.Append,
FileAccess.Write, FileShare.None))
{
using (StreamWriter sr = new StreamWriter(fs))
{
sr.WriteLine(timestamp + ": " + num);
}
}
}
您还可以使用在实际写作功能本身的“锁定”语句(即内AddLog)而不是在后台工作人员的职能中。
- 1. C#如何锁定文件
- 2. 如何使Windows文件锁定更像UNIX文件锁定?
- 3. 无论锁定状态如何,写入锁定的文件
- 4. 如何在C中锁定文件夹#
- 5. 如何删除被锁定的文件?
- 6. 如何从Team Foundation Server锁定文件?
- 7. 如何锁定网页文件夹?
- 8. 如何在Actionscript中锁定文件?
- 9. 如何在PHP中锁定文件?
- 10. 如何删除锁定的文件夹
- 11. ClearCase“锁定”文件 - 如何重构?
- 12. 如何用C#锁定文件?
- 13. 如何写入和锁定文件
- 14. 如何删除锁定的文件?
- 15. 如何不锁定两个文件Assembly.Load
- 16. 如何锁定Windows中的文件?
- 17. 如何等待并锁定文件
- 18. FileInfo锁定文件!
- 19. HttpPostedFileBase锁定文件
- 20. Java文件锁定
- 21. PowerShell锁定文件
- 22. Linux文件锁定
- 23. System.Reflection.Assembly.LoadFile锁定文件
- 24. 锁定XML文件
- 25. System.IO.File.Create锁定文件
- 26. 如何锁定文本框?
- 27. 如何解锁被.NET中的进程锁定的文件
- 28. 使用box api,我如何锁定或解锁文件?
- 29. 如何解锁由pexif锁定的文件
- 30. 如何删除文件锁
这可能会导致几十个不同的答案,这都将是有效的。请添加更多细节。 (顺便说一下,只是认为该文件可能已经阻止了其他访问它的其他人)。 – 2009-09-16 09:57:32
插入密钥,将其转到左侧。 – 2009-09-16 10:23:25
这工作对我来说http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-being-changed-while-processing/4693064#4693064 – Vbp 2014-07-13 15:59:43