SMB访问绕过文件共享冲突

时间:2019-07-10 16:39:41

标签: file windows-ce smb

我有一台Windows CE 5.0计算机,该计算机具有smb共享,用于文件\hard disk2\logs\myfile.err
该文件由批处理脚本创建,该脚本将另一个exe的stderr重定向到该文件:myapp.exe 2> "\hard disk2\logs\myfile.err"

考虑到在myfile.err运行时无法在Windows CE计算机上用NotepadCE打开myapp.exe的情况下,此操作效果非常好。如果我尝试NotepadCE显示共享冲突错误。

同一文件可以通过smb共享同时读取,而不会出现任何问题。

是否可以在不停止myapp.exe的情况下使Windows CE计算机上的其他程序读取此文件?

为什么可以通过smb读取它,但无法以其他方式读取它?

作为一种解决方法,我设法将文件复制到另一个位置,然后从那里读取它。

1 个答案:

答案 0 :(得分:1)

  

为什么可以通过smb读取它,但无法以其他方式读取它?

我想这与传递给CreateFile的选项有关。

例如,使用以下命令打开文件

CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, ...)

请求读取访问权限,同时允许其他人读取和写入。 SMB服务可能就是这样做的。

开头为

CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...)

请求读/写访问权限,同时阻止其他人写操作。批处理脚本可能会这样做。

最后NotepadCE可能正在尝试使用打开文件

CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, ...)

将会失败,因为它正在请求批处理解释程序通过在FILE_SHARE_READ调用中仅传递CreateFile而拒绝的写访问权限。

当然,在没有访问源代码的情况下,所有这些都是猜测,但是,如果您能够如上面的第一个示例所示在本地打开文件,则可以支持该理论。

More about CreateFile in the Docs.

  

是否有一种方法可以使Windows CE计算机上的其他程序在不停止myapp.exe的情况下读取此文件?

是的,是的。无需重定向stderr,而是让myapp.exe将其输出直接写入myfile.err,在创建文件时在FILE_SHARE_READ | FILE_SHARE_WRITE调用中传递CreateFile。这将允许其他请求写访问权限的程序打开myfile.err。