Доступ SMB обходит нарушение совместного доступа к файлам - PullRequest
1 голос
/ 10 июля 2019

У меня есть машина Windows CE 5.0 с общим ресурсом smb для файла \hard disk2\logs\myfile.err.
Этот файл создается пакетным скриптом, который перенаправляет stderr другого exe-файла в этот файл: myapp.exe 2> "\hard disk2\logs\myfile.err".

Это работает на удивление хорошо, учитывая, что я не могу открыть myfile.err с NotepadCE на компьютере с Windows CE, когда myapp.exe работает. Если я попытаюсь, NotepadCE выдает ошибку нарушения общего доступа.

Этот же файл может быть прочитан в одно и то же время общим ресурсом smb без проблем.

Есть ли способ разрешить другим программам на компьютере с Windows CE читать этот файл без остановки myapp.exe?

Почему можно читать через smb, но невозможно прочитать по-другому?

В качестве обходного пути мне удалось скопировать файл в другое место и затем прочитать его оттуда.

1 Ответ

1 голос
/ 11 июля 2019

Почему можно читать его через 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.

Конечно, без доступа к исходному коду это все догадки, но если вы можете открыть файл локально, как показано в первом примере выше, то он поддерживаеттеория.

Подробнее о CreateFile в Документах.

Есть ли способ, позволяющий другим программам на компьютере с Windows CE читать этот файл без остановкиmyapp.exe?

Вроде да.Вместо перенаправления stderr просто напишите myapp.exe свои выходные данные непосредственно в myfile.err, передавая FILE_SHARE_READ | FILE_SHARE_WRITE в вызове CreateFile при создании файла.Это позволило бы другим программам, которые запрашивают доступ для записи, открыть myfile.err.

...