希望更多的是“我做错了什么?”比“我怎么样?”但你去了......
基本上,我试图让程序以下列方式运行:
程序的第一个实例在PC1上打开,打开一个文件进行读/写访问,然后充当主程序,在其他一些文件上做一堆工作我不想要一大堆用户一次访问。
程序的第二个实例启动,尝试打开文件进行读/写访问,失败,进入Slave模式,打开文件进行读访问,并定期从该文件中读取其他文件的状态
无论如何,那是计划。如果有人能提出更好的方法来处理主/从决策,我愿意接受建议。
无论如何,作为实现的引导,我有两个Visual Studio实例打开。一个是运行名为“GetFile”的项目,另一个是运行名为“TryGetFile”的项目。
“GetFile”有一个Private myStream As IO.FileStream
对象,并使用以下行打开测试文件:
myStream = IO.File.Open("\\[network path]\test.txt", IO.FileMode.OpenOrCreate,
IO.FileAccess.ReadWrite, IO.FileShare.ReadWrite)
这很好用,据我所知,应该允许任何其他进程进一步读/写访问此文件,这对于此测试阶段来说很好。
“TryGetFile”也有一个Private myStream As IO.FileStream
对象,但它会尝试以下开放代码:
myStream = IO.File.Open("\\[network path]\test.txt", IO.FileMode.Open,
IO.FileAccess.Read, IO.FileShare.Read)
这根本不起作用。我收到一个IOException,报告test.txt
由另一个进程打开,我不允许使用它。
基本上,我看不出问题所在;我不认为“TryGetFile”要求任何文件访问“GetFile”禁止它。据我所知,“GetFile”不应该禁止任何类型的访问......
我搞砸了什么,这里?
编辑:嗯...好的,Henk和Richard回答了原来提出的问题,指出问题是“TryGetFile”试图将文件共享权限缩小到Read,其中“GetFile”已经允许ReadWrite访问。改变“TryGetFile”以允许ReadWrite共享让代码运行。
不幸的是根据他们的建议更改代码,以便“GetFile”和“TryGetFile”允许IO.FileShare.Read共享:
'GetFile
myStream = IO.File.Open("\\[network path]\test.txt", IO.FileMode.Open,
IO.FileAccess.ReadWrite, IO.FileShare.Read)
'TryGetFile
myStream = IO.File.Open("\\[network path]\test.txt", IO.FileMode.Open,
IO.FileAccess.Read, IO.FileShare.Read)
导致TryGetFile再次抛出IOException。
这里有什么问题?
答案 0 :(得分:2)
在所有情况下,你应该能够这样做:
FileAccess.ReadWrite
和FileShare.Read
FileAccess.Read
和FileShare.ReadWrite
第一个只有在没有其他人有写锁定(并添加写锁定)的情况下才能工作,但是会允许其他读者(然后在2中使用)。但是,事实证明,后来的读者也必须允许其他人写作。
在PowerShell中进行测试后更新了最后一个注释($name
包含文件的绝对路径,以避免PowerShell的效果不直接显示进程的基础当前目录):
第一个过程:
$file = [io.file]::Open($name, [io.filemode]::Open, [io.fileaccess]::ReadWrite, [io.fileshare]::Read)
第二个过程:
$file = [io.file]::Open($name, [io.filemode]::Open, [io.fileaccess]::Read, [io.fileshare]::readwrite)
我在Process Explorer中看到文件在两个进程中都是打开的。
答案 1 :(得分:1)
在您当前的代码中,TryGetFile试图拒绝其他人的写访问权限。所以制作最后一行代码;
myStream = File.Open("\\[network path]\test.txt", FileMode.Open,
FileAccess.Read, FileShare.ReadWrite)
澄清一点:
FileAccess.Read
表示TryGetFile只想阅读
FileShare.ReadWrite
表示不介意其他人(GetFile)读或写
答案 2 :(得分:0)
指定类型的
FileShare
值 访问其他线程必须 文件。
因此,您需要TryGetFile和GetFile的ReadWrite。