好吧,伙计们,这是一个艰难的。
场景 :
[编码]
using (StreamWriter outfile = new StreamWriter(pathToTheFile, false))
{
outfile.Write(stringToWriteInTheFile);
}
[/编码]
问题 :
有时该服务仍然“卡在”这条指令上。给出的错误是:
该进程无法访问文件“\\filername\foo\bar\myfile.txt”,因为它正被另一个进程使用。
在其中一些错误之后,服务拒绝释放对文件的锁定。那会发生什么?
您可以删除该文件,但会立即重新创建该文件。就像某种永久 Stream 还活着并无限期地写入文件一样。
您可以停止该服务:它被卡住了,并且不会被停止,所以我在 2 分钟后强制执行了 Thread.Abort(是的,我知道但要练习,但还有什么?)。
因此,服务现在停止了,但机器保留了文件的句柄,除非重新启动机器,否则您无法终止保持句柄事件的进程。 . .
我现在不知道该怎么办,我想我已经尝试了一切。
注意事项 :
以前,FILER 和机器都使用 SMB1,从来没有出现过这个问题。所以我猜在后台发生了一些可疑的事情,但我不明白是什么......
我最近更改了用于编写文件的代码,绝望地尝试将所有内容“委托(delegate)”给 .net。现在是:
File.WriteAllText(pathToTheFile, stringToWriteInTheFile);
但我的直觉是,在幕后,.net 正在做完全相同的事情 - 虽然这个变化是最近发生的,所以我仍然不能说“修复”是否有效。
编辑(根据 Vash 评论):通常文件是不同的,但有时可能会发生(并且实际上会发生)多个线程试图写入同一个文件,但是 :( - 执行 File.WriteAllText 不应该注意并发问题?
最佳答案
尝试以“独占”模式显式打开 FileStream,即
using (var fs = new FileStream("path",
FileMode.Open, FileAccess.ReadWrite,
FileShare.None))
{
using (var sw = new StreamWriter(fs))
{
...
当然,您的代码必须预料到该文件在写入时可能会被锁定并做出适当的 react 。这部分留给读者作为练习:-)
免责声明:我已经在多线程环境中使用过它,但我不能保证它可以在 Samba 上工作。
关于c# - StreamWriter 和 Samba2 (SMB2),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5621639/