【问题标题】:SMB access bypasses file sharing violationSMB 访问绕过文件共享冲突
【发布时间】:2019-07-10 16:39:41
【问题描述】:

我有一台带有 smb 共享文件的 Windows CE 5.0 机器\hard disk2\logs\myfile.err
此文件由批处理脚本创建,该脚本将另一个 exe 的标准错误重定向到该文件:myapp.exe 2> "\hard disk2\logs\myfile.err"

考虑到当myapp.exe 正在运行时,我无法在Windows CE 机器上使用NotepadCE 打开myfile.err,这非常有效。如果我尝试 NotepadCE 显示共享冲突错误。

同一个文件可以被它的 smb 共享同时读取,没有任何问题。

有没有办法让 Windows CE 机器上的其他程序在不停止myapp.exe 的情况下读取这个文件?

为什么通过smb可以读取,而用其他方式读取却不行?

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

【问题讨论】:

    标签: file windows-ce smb


    【解决方案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, ...)
    

    这将失败,因为它正在请求写入访问权限,而批处理解释器已通过在 CreateFile 调用中仅传递 FILE_SHARE_READ 来拒绝。

    当然,如果无法访问源代码,这都是猜测,但如果您能够如上面第一个示例所示在本地打开文件,则支持该理论。

    More about CreateFile in the Docs.

    有没有办法让 Windows CE 机器上的其他程序在不停止 myapp.exe 的情况下读取这个文件?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2017-12-09
      • 2012-02-12
      • 2018-07-26
      • 2020-01-14
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多