我有一台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读取它,但无法以其他方式读取它?
作为一种解决方法,我设法将文件复制到另一个位置,然后从那里读取它。
答案 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。