如何从多个进程打开文件?

时间:2010-10-06 10:04:16

标签: .net vb.net file

希望更多的是“我做错了什么?”比“我怎么样?”但你去了......

基本上,我试图让程序以下列方式运行:

  • 程序的第一个实例在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”要求任何文件访问“Ge​​tFile”禁止它。据我所知,“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。

这里有什么问题?

3 个答案:

答案 0 :(得分:2)

在所有情况下,你应该能够这样做:

  1. FileAccess.ReadWriteFileShare.Read
  2. 打开
  3. 如果#1未能通过FileAccess.ReadFileShare.ReadWrite
  4. 打开

    第一个只有在没有其他人有写锁定(并添加写锁定)的情况下才能工作,但是会允许其他读者(然后在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。