CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 11.05.20 18:10
Оценка:
Привет!

Если при создании файла существует папка с таким именем, то CreateFile возвращает AccessDenied, а хотелось бы получать нормальный статус ошибки, например ERROR_ALREADY_EXISTS. Т.е. если я получаю AccessDenied, то чтобы проверить, существует ли объект с таким именем нужно вызвать например FindFirstFile, но в момент его вызова папку могут удалить, и тогда будет непонятно, почему был запрещён доступ. Есть ли какой-нибудь способ решить эту проблему?

Файл должен создаваться как CREATE_NEW, т.к. нужно именно создание нового файла. Хотя при CREATE_ALWAYS аналогично возвращается AccessDenied

Пример кода:

    BOOL b = CreateDirectory(L"D:\\tmp\\d", NULL);
    HANDLE h = CreateFile(L"D:\\tmp\\d", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    DWORD err = GetLastError();
    // err  == ERROR_ACCESS_DENIED
    // если сейчас вызвать FindFirstFile(L"D:\\tmp\\d), то папка уже может быть удалена, и непонятно почему не создался файл
Re: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 11.05.20 18:24
Оценка:
Нашёл такой способ: создаём файл с рандомным именем, потом пытаемся переименовать, и если существует папка, то ошибка будет как раз ERROR_ALREADY_EXISTS. Вроде подходит для моей задачи


    BOOL b = CreateDirectoryW(L"D:\\tmp\\1\\d", NULL);
    HANDLE h = CreateFile(L"D:\\tmp\\1\\random_name", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    CloseHandle(h);


    BOOL res = MoveFileW(L"D:\\tmp\\1\\random_name", L"D:\\tmp\\1\\d");
    DWORD err = GetLastError();
    // err == ERROR_ALREADY_EXISTS - значит существует файл или папка
Re[2]: CreateFile - AccessDenied когда существует папка
От: Сергей Мухин Россия  
Дата: 11.05.20 19:32
Оценка: 1 (1)
Здравствуйте, MuPoB, Вы писали:

MPB>Нашёл такой способ: создаём файл с рандомным именем, потом пытаемся переименовать, и если существует папка, то ошибка будет как раз ERROR_ALREADY_EXISTS. Вроде подходит для моей задачи



MPB>
MPB>    BOOL b = CreateDirectoryW(L"D:\\tmp\\1\\d", NULL);
MPB>    HANDLE h = CreateFile(L"D:\\tmp\\1\\random_name", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
MPB>    CloseHandle(h);


MPB>    BOOL res = MoveFileW(L"D:\\tmp\\1\\random_name", L"D:\\tmp\\1\\d");
MPB>    DWORD err = GetLastError();
MPB>    // err == ERROR_ALREADY_EXISTS - значит существует файл или папка
MPB>


может проще GetFilAttrbutes c проверкой на INVALID_FILE_ATTRIBUTES и FILE_ATTRIBUTE_DIRECTORY
---
С уважением,
Сергей Мухин
Re[3]: CreateFile - AccessDenied когда существует папка
От: Сергей Мухин Россия  
Дата: 11.05.20 19:37
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:



MPB>> BOOL res = MoveFileW(L"D:\\tmp\\1\\random_name", L"D:\\tmp\\1\\d");

MPB>> DWORD err = GetLastError();
MPB>> // err == ERROR_ALREADY_EXISTS — значит существует файл или папка
MPB>>[/ccode]

СМ>может проще GetFilAttrbutes c проверкой на INVALID_FILE_ATTRIBUTES и FILE_ATTRIBUTE_DIRECTORY

но правильно после получения ошибки, начать анализировать что произошло. нет доступа к файлу (в том числе это директория) и тп
---
С уважением,
Сергей Мухин
Re[4]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 11.05.20 19:58
Оценка: 1 (1)
СМ>>может проще GetFilAttrbutes c проверкой на INVALID_FILE_ATTRIBUTES и FILE_ATTRIBUTE_DIRECTORY
СМ>но правильно после получения ошибки, начать анализировать что произошло. нет доступа к файлу (в том числе это директория) и тп

Проблема в том, что между вызовом функции CreateFile и вызовом любой функции, анализирующей ошибку (GetFilAttrbutes, FindFirstFile и т.п.) может произойти всё что угодно, и то, что вернёт функция анализа, будет уже неадекватно. Или если сначала проверить, существует такая папка или нет, а потом создать файл — опять перед созданием состояние ФС может поменяться

Нужно чтобы сразу ошибка была говорящей, а не просто AccessDenied. Создание рандомного файла и его переименование сразу позволяет понять, что директория с таким именем уже существует
Re[5]: CreateFile - AccessDenied когда существует папка
От: Alexander G Украина  
Дата: 12.05.20 16:13
Оценка: 5 (2) +1
Здравствуйте, MuPoB, Вы писали:

MPB>Проблема в том, что между вызовом функции CreateFile и вызовом любой функции, анализирующей ошибку (GetFilAttrbutes, FindFirstFile и т.п.) может произойти всё что угодно, и то, что вернёт функция анализа, будет уже неадекватно. Или если сначала проверить, существует такая папка или нет, а потом создать файл — опять перед созданием состояние ФС может поменяться


MPB>Нужно чтобы сразу ошибка была говорящей, а не просто AccessDenied. Создание рандомного файла и его переименование сразу позволяет понять, что директория с таким именем уже существует


Есть решение. После неуспешного CreateFile получить последний NTSTATUS из TEB.

HANDLE h = ::CreateFile(path, 0, 7, 0, OPEN_ALWAYS, 0, 0);
if (h == INVALID_HANDLE_VALUE)
{
   NTSTATUS status = GetLastNtStatus();
   if (status == STATUS_FILE_IS_A_DIRECTORY) { ... }
}


Разве что заминка будет с GetLastNtStatus. Документриованный путь мне неизвестен.
Недокументировано как-то так:
inline NTSTATUS GetLastNtStatus()
{
#if defined(_M_X64)
    return __readgsdword(0x1250);
#elif defined (_M_IX86)
    return __readfsdword(0xBF4);
#else
#error Implement this for ARM or whatever architecture you have
#endif 
}

Магические константы подсмотрел в Википедии.

Более чистым, возможно, будет прямой вызов NtCreateFile / NtOpenFile.
Это более легально с точки зрения документрованности, но потребует большего изменения вызывающего кода.
Русский военный корабль идёт ко дну!
Отредактировано 12.05.2020 16:18 Alexander G . Предыдущая версия .
Re[6]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 12.05.20 18:36
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Есть решение. После неуспешного CreateFile получить последний NTSTATUS из TEB.

...
AG>Более чистым, возможно, будет прямой вызов NtCreateFile / NtOpenFile.
AG>Это более легально с точки зрения документрованности, но потребует большего изменения вызывающего кода.

Да, TEB не очень хочется парсить, тут действительно проще NtCreateFile вызвать и статус проверить. Спасибо!
Ну подумаю еще, как лучше сделать, NtCreateFile тоже разной подготовительной работы требует
Re[5]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.07.20 18:43
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>Проблема в том, что между вызовом функции CreateFile и вызовом любой функции, анализирующей ошибку (GetFilAttrbutes, FindFirstFile и т.п.) может произойти всё что угодно, и то, что вернёт функция анализа, будет уже неадекватно. Или если сначала проверить, существует такая папка или нет, а потом создать файл — опять перед созданием состояние ФС может поменяться


Если не секрет, для чего Вы с большой скоростью создаете файлы в каталоге, где кто-то другой со сравнимой скоростью создает свои подкаталоги?
Re[6]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 13.07.20 20:34
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Если не секрет, для чего Вы с большой скоростью создаете файлы в каталоге, где кто-то другой со сравнимой скоростью создает свои подкаталоги?


Вообще для файлового менеджера, а ситуация эта гипотетическая, просто не хочется вызывать дополнительную функцию для анализа причины ошибки, тем более что эта дополнительная функция может вернуть ложь
Re[7]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 13.07.20 20:40
Оценка:
Вот например ещё такой случай может быть — диск закрыт на запись, там есть папка 123. Пытаемся создать файл 123 — AccessDenied. Если посмотреть, что там существует папка 123, и сказать, что не получилось создать файл из-за конфликта имени с папкой — это неверно. Хотя что вернёт в этом случае NtCreateFile — надо посмотреть
Re[7]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.07.20 20:49
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>Вообще для файлового менеджера, а ситуация эта гипотетическая, просто не хочется вызывать дополнительную функцию для анализа причины ошибки


Для файлового менеджера, управляемого вручную, подобная эквилибристика совершенно избыточна. Достаточно вывести системное сообщение об ошибке, снабдив его рекомендацией проверить то-то и то-то.
Re[8]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 13.07.20 21:50
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, MuPoB, Вы писали:


MPB>>Вообще для файлового менеджера, а ситуация эта гипотетическая, просто не хочется вызывать дополнительную функцию для анализа причины ошибки


ЕМ>Для файлового менеджера, управляемого вручную, подобная эквилибристика совершенно избыточна.


Это пока не понадобится скопировать что-то, где сто тыщ директорий и гориллион файлов.
Re[9]: CreateFile - AccessDenied когда существует папка
От: reversecode google
Дата: 13.07.20 21:55
Оценка: +1
S>Это пока не понадобится скопировать что-то, где сто тыщ директорий и гориллион файлов.

это делается через SHFileOperation

а игры с крейт дир, делейт дир, крейт файл и записать что то насильно
да еще и как можно быстрее а то кто то другой может это перезаписать обратно
это точно зловреды
Re[10]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 13.07.20 22:00
Оценка:
Здравствуйте, reversecode, Вы писали:


S>>Это пока не понадобится скопировать что-то, где сто тыщ директорий и гориллион файлов.


R>это делается через SHFileOperation


Мне помнится, SHFileOperation было не совсем хорошо, по крайней мере давно когда-то.

R>а игры с крейт дир, делейт дир, крейт файл и записать что то насильно

R>да еще и как можно быстрее а то кто то другой может это перезаписать обратно
R>это точно зловреды

В файл-менеджере, если логи например какие-то копировать куда-то, там не как можно быстрее, но регулярно бывает, что могут из-под ног выдернуть что-то. Ну то есть начинаешь копировать, прочитал список файлов, а когда собрался копировать, файлов уже нет, потому что их в архив свернули.
Re[11]: CreateFile - AccessDenied когда существует папка
От: reversecode google
Дата: 13.07.20 22:07
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Здравствуйте, reversecode, Вы писали:



S>>>Это пока не понадобится скопировать что-то, где сто тыщ директорий и гориллион файлов.


R>>это делается через SHFileOperation


S>Мне помнится, SHFileOperation было не совсем хорошо, по крайней мере давно когда-то.


именно это да еще и с расширенным кодом ошибок


R>>а игры с крейт дир, делейт дир, крейт файл и записать что то насильно

R>>да еще и как можно быстрее а то кто то другой может это перезаписать обратно
R>>это точно зловреды

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


у тс другая ситуация
начинаем что то писать, ага какое писать с WriteFile ? бред
ну так начинаем писать имя файла которое может вдруг совпадать с именем диры которая там может быть
бац
надо наплевать и насильно переписать эту диру именно в имя такого файла

да за такой функционал в файловом менеджере сразу в зловреды и заносить во все ав базы
Re[11]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 06:30
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>В файл-менеджере, если логи например какие-то копировать куда-то, там не как можно быстрее, но регулярно бывает, что могут из-под ног выдернуть что-то.


Нет никакой разницы, в менеджере или еще где-то. Когда копируешь не свое — всегда существует вероятность, что выдернут посреди процесса. Но это не имеет отношения к обсуждаемой проблеме.
Re[12]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 14.07.20 08:04
Оценка: 1 (1)
Здравствуйте, reversecode, Вы писали:

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


R>у тс другая ситуация

R>начинаем что то писать, ага какое писать с WriteFile ? бред

Начинаем с CreateFile() (а как ещё?)

R>ну так начинаем писать имя файла которое может вдруг совпадать с именем диры которая там может быть


Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config. И такого там заметно больше одного раза.

R>бац

R>надо наплевать и насильно переписать эту диру именно в имя такого файла

Он не спрашивал как переписать, он спрашивал, как понять, почему файл не создался.
Re[12]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 08:09
Оценка:
Здравствуйте, reversecode, Вы писали:


R>у тс другая ситуация

R>начинаем что то писать, ага какое писать с WriteFile ? бред
R>ну так начинаем писать имя файла которое может вдруг совпадать с именем диры которая там может быть
R>бац
R>надо наплевать и насильно переписать эту диру именно в имя такого файла

R>да за такой функционал в файловом менеджере сразу в зловреды и заносить во все ав базы


У тебя профдеформация на почве зловредов? Какой функционал ты увидел?
Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?
Как ты собрался копировать файл без использования WriteFile?
Re[13]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 08:13
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Здравствуйте, reversecode, Вы писали:


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


R>>у тс другая ситуация

R>>начинаем что то писать, ага какое писать с WriteFile ? бред

S>Начинаем с CreateFile() (а как ещё?)


R>>ну так начинаем писать имя файла которое может вдруг совпадать с именем диры которая там может быть


S>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config. И такого там заметно больше одного раза.


R>>бац

R>>надо наплевать и насильно переписать эту диру именно в имя такого файла

S>Он не спрашивал как переписать, он спрашивал, как понять, почему файл не создался.



Да, нужно именно понять причину, директорию зачем переписывать, странные мысли в голове у reversecode
Re[10]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 08:25
Оценка:
Здравствуйте, reversecode, Вы писали:


S>>Это пока не понадобится скопировать что-то, где сто тыщ директорий и гориллион файлов.


R>это делается через SHFileOperation


R>а игры с крейт дир, делейт дир, крейт файл и записать что то насильно

R>да еще и как можно быстрее а то кто то другой может это перезаписать обратно
R>это точно зловреды

А SHFileOperation по твоему сама копирует файлы? Без использования CreateFile+WriteFile? И ты думаешь что нормальная ошибка там вернётся?

Если ты не в курсе, то NtCreateFile официально документирована, включена в заголовочные файлы, и может быть использована в прикладном коде без получения её адреса через GetProcAddress

Директорию типа нельзя через CreateDir создавать? А что ещё нельзя?
Re[8]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 08:39
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Для файлового менеджера, управляемого вручную, подобная эквилибристика совершенно избыточна. Достаточно вывести системное сообщение об ошибке, снабдив его рекомендацией проверить то-то и то-то.


Вот именно, надо вывести нормальную ошибку с рекомендацией сохранить под другим именем. Но ни один файловый менеджер не показывает это, Проводник хотя бы говорит, что папка есть с таким именем, но не предлагает сохранить файл под другим именем. А остальные менеджеры вообще фигню показывают
Re[10]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 09:32
Оценка:
Здравствуйте, reversecode, Вы писали:


S>>Это пока не понадобится скопировать что-то, где сто тыщ директорий и гориллион файлов.


R>это делается через SHFileOperation


И да, как ты собрался копировать файл с FTP или SSH через SHFileOperation?
Re[13]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 09:38
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config.


Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.
Re[13]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 09:41
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?


Именно так, а в комментарии "от себя" указать наиболее вероятные причины. Описанные проблемы, при адекватном использовании любого файлового менеджера, возникают редко. Нет никакого практического смысла пытаться обработать все подобные случаи в автоматическом режиме — продвинутому пользователю это не особо поможет, а обычный все равно не поймет.
Re[14]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 09:47
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, MuPoB, Вы писали:


MPB>>нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?


ЕМ>Именно так, а в комментарии "от себя" указать наиболее вероятные причины. Описанные проблемы, при адекватном использовании любого файлового менеджера, возникают редко. Нет никакого практического смысла пытаться обработать все подобные случаи в автоматическом режиме — продвинутому пользователю это не особо поможет, а обычный все равно не поймет.


Так и нужно в ручном, чтобы пользователь выбрал. Просто если будет ошибка AccessDenied — тут особых вариантов нет, только пропустить или попытаться повторить, а если конфликт имени с папкой — это другое, и тут можно сразу предложить использовать другое имя.
Просто если есть возможность сразу понять причину ошибки, не прибегая к каким-то вероятностным вычислениям, то ей и нужно пользоваться
Re[15]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 10:36
Оценка:
Здравствуйте, MuPoB, Вы писали:

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


Ну так и проверяйте программно, существует такой каталог, или нет. Для подавляющего большинства ситуаций, кроме ничтожной части весьма специфических, этого будет достаточно. Вместо этого Вы, под эгидой крайнего перфекционизма, хотите странного. Это и порождает закономерные вопросы о том, для чего это может быть нужно. Всех возможных комбинаций исходных данных и результатов Вы в любом случае предусмотреть не сможете. Отчего Вас заело именно на этой?
Re[16]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 10:54
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, MuPoB, Вы писали:


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


ЕМ>Ну так и проверяйте программно, существует такой каталог, или нет. Для подавляющего большинства ситуаций, кроме ничтожной части весьма специфических, этого будет достаточно. Вместо этого Вы, под эгидой крайнего перфекционизма, хотите странного. Это и порождает закономерные вопросы о том, для чего это может быть нужно. Всех возможных комбинаций исходных данных и результатов Вы в любом случае предусмотреть не сможете. Отчего Вас заело именно на этой?


Я уже писал, какие ситуации могут быть — каталог закрыт на запись, и есть подпапка с таким именем. Может быть что-то ещё. Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile?
Понятно что все возможные случаи нельзя отловить, но в данном конкретном вместо AcceessDenied можно вернуть настоящую ошибку.

Или вы тоже сторонник полного запрета Nt функций в прикладном коде? Тогда пишите в майкрософт, а то они совсем распоясались, уже в заголовочные файлы их включают
Re[17]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 11:08
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile?


"Что-то дополнительное выдумывать" — это как раз использовать NtCreateFile и затем бороться с ее особенностями
Автор: MuPoB
Дата: 12.07.20
. Фактически, Вы уже потратили на все это в несколько раз больше времени, чем было достаточно для разумного решения проблемы, что и вызывает закономерное непонимание.

MPB>Понятно что все возможные случаи нельзя отловить, но в данном конкретном вместо AcceessDenied можно вернуть настоящую ошибку.


Сколько раз лично Вы или Ваши пользователи сталкивались с ситуацией, когда лишь использование атомарной операции вроде NtCreateFile позволило что-то радикально изменить в последовательности действий?

MPB>Или вы тоже сторонник полного запрета Nt функций в прикладном коде?


Я сторонник разумного использования средств, не предназначенных для прикладных программистов.
Re[14]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 14.07.20 11:12
Оценка: 1 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Sharowarsheg, Вы писали:


S>>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config.


ЕМ>Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.


Да, но Access Denied? Напомнило мне вот эту картинку —

Re[15]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 11:23
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Да, но Access Denied?


Согласен, неудачный код для такой ситуации. Какой-нибудь "name conflict" подошел бы лучше.

Кстати, а *nix'ы что возвращают в такой ситуации?
Re[18]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 11:26
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, MuPoB, Вы писали:


MPB>>Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile?


ЕМ>"Что-то дополнительное выдумывать" — это как раз использовать NtCreateFile и затем бороться с ее особенностями
Автор: MuPoB
Дата: 12.07.20
. Фактически, Вы уже потратили на все это в несколько раз больше времени, чем было достаточно для разумного решения проблемы, что и вызывает закономерное непонимание.


Как раз нет, вот ловить ошибку AccessDenied и гадать, что случилось на самом деле будет сложнее, чем один раз (один раз, Карл!) разобраться с NtCreateFile

ЕМ>Сколько раз лично Вы или Ваши пользователи сталкивались с ситуацией, когда лишь использование атомарной операции вроде NtCreateFile позволило что-то радикально изменить в последовательности действий?


Да причём тут атомарная/неатомарная, если даже для случая с запретом записи в каталог нельзя понять причину ошибки?
Вообще конкретно с этим случаем я не сталкивался, но это не значит, что он невозможен. Просто на винде обычно у файлов есть расширения, и таких конфликтов обычно не бывает. Но при копировании с линукса например, это более вероятно

MPB>>Или вы тоже сторонник полного запрета Nt функций в прикладном коде?


ЕМ>Я сторонник разумного использования средств, не предназначенных для прикладных программистов.


Если функция документирована, включена в заголовочный файл, значит, она предназначена для использования в прикладном коде
Re[19]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 11:43
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>ловить ошибку AccessDenied и гадать, что случилось на самом деле


Не нужно ни о чем гадать, нужно просто выполнить пару-тройку дополнительных операций. Это вполне типичная в программировании ситуация, когда возвращаемый код не позволяет однозначно определить проблему.

MPB>Вообще конкретно с этим случаем я не сталкивался, но это не значит, что он невозможен.


Если Вы пытаетесь охватить все возможные случаи, то безусловно потерпите неудачу.

MPB>Просто на винде обычно у файлов есть расширения, и таких конфликтов обычно не бывает. Но при копировании с линукса например, это более вероятно


При копировании с других ФС принципиально невозможно получить адекватную копию в полностью автоматическом режиме. В каждом подобном случае необходимо ручное вмешательство. Что давно и успешно делают архиваторы, умеющие распаковывать такие структуры.

MPB>Если функция документирована, включена в заголовочный файл, значит, она предназначена для использования в прикладном коде


Она документирована с соответствующей пометкой. И в winternl.h тоже есть соответствующее предупреждение. Это говорит о том, что эти средства следует использовать лишь при реальной необходимости — например, для обращения к объектам, связаться с которыми через CreateFile невозможно в принципе.
Re[16]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 14.07.20 11:47
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Sharowarsheg, Вы писали:


S>>Да, но Access Denied?


ЕМ>Согласен, неудачный код для такой ситуации. Какой-нибудь "name conflict" подошел бы лучше.


ЕМ>Кстати, а *nix'ы что возвращают в такой ситуации?


Не знаю, не встречался. Прочитал вот это, но с двух раз ничего не понял — https://man7.org/linux/man-pages/man2/open.2.html
Re[17]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 11:58
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Прочитал вот это, но с двух раз ничего не понял — https://man7.org/linux/man-pages/man2/open.2.html


Я с ходу тоже не понял. Вроде бы EISDIR по смыслу подходит, но он тоже возвращается для разных ситуаций, и с каждой тоже нужно разбираться предметно.
Re[20]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 14.07.20 16:27
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, MuPoB, Вы писали:


MPB>>ловить ошибку AccessDenied и гадать, что случилось на самом деле

ЕМ>Не нужно ни о чем гадать, нужно просто выполнить пару-тройку дополнительных операций. Это вполне типичная в программировании ситуация, когда возвращаемый код не позволяет однозначно определить проблему.

То есть на полном серьёзе предлагается сначала запросить является ли диск доступным для записи, потом определить, есть ли права у пользователя на запись, потом поискать, есть ли папка с таким именем, и всё только потому что страшно вызвать NtCreateFile и проверить код возврата?

MPB>>Вообще конкретно с этим случаем я не сталкивался, но это не значит, что он невозможен.

ЕМ>Если Вы пытаетесь охватить все возможные случаи, то безусловно потерпите неудачу.

Какие все? Есть конкретный случай, он один

MPB>>Просто на винде обычно у файлов есть расширения, и таких конфликтов обычно не бывает. Но при копировании с линукса например, это более вероятно

ЕМ>При копировании с других ФС принципиально невозможно получить адекватную копию в полностью автоматическом режиме. В каждом подобном случае необходимо ручное вмешательство. Что давно и успешно делают архиваторы, умеющие распаковывать такие структуры.

Опять какой-то автоматический режим. Откуда он взялся? Все конфликты будут разруливаться в ручном режиме.

MPB>>Если функция документирована, включена в заголовочный файл, значит, она предназначена для использования в прикладном коде

ЕМ>Она документирована с соответствующей пометкой. И в winternl.h тоже есть соответствующее предупреждение. Это говорит о том, что эти средства следует использовать лишь при реальной необходимости — например, для обращения к объектам, связаться с которыми через CreateFile невозможно в принципе.

Да, понятно что нужно аккуратно всё использовать, но зачем вообще майкрософт добавила эти функции в заголовочный файл? Почему не оставила всё как раньше, чтобы получать через GetProcAddress? Значит, что эти функции многим людям нужны, возможно что мой случай как раз из таких
Re[21]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.07.20 20:49
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>То есть на полном серьёзе предлагается сначала запросить является ли диск доступным для записи, потом определить, есть ли права у пользователя на запись, потом поискать, есть ли папка с таким именем


Нет, предлагается делать это в обратном порядке.

MPB>и всё только потому что страшно вызвать NtCreateFile и проверить код возврата?


Кому страшно?

MPB>Все конфликты будут разруливаться в ручном режиме.


Тогда почему Вы напрягаетесь, что кто-то может выдернуть у Вас из-под носа конфликтующий с файлом каталог?

MPB>Значит, что эти функции многим людям нужны


Обычно они используются для более серьезных вещей.
Re[22]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 10:23
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

MPB>>То есть на полном серьёзе предлагается сначала запросить является ли диск доступным для записи, потом определить, есть ли права у пользователя на запись, потом поискать, есть ли папка с таким именем

ЕМ>Нет, предлагается делать это в обратном порядке.

В каком обратном? Проверить есть ли папка, потом проверять права? И зачем такие костыли? Т.е. в любом случае если есть папка, это не значит, что будет ошибка конфликта имён, потому что может не быть права на запись, и тут уже настоящий AccessDenied

MPB>>и всё только потому что страшно вызвать NtCreateFile и проверить код возврата?

ЕМ>Кому страшно?

Вам например, вы же на ровном месте костылями обкладываться предлагаете

MPB>>Все конфликты будут разруливаться в ручном режиме.

ЕМ>Тогда почему Вы напрягаетесь, что кто-то может выдернуть у Вас из-под носа конфликтующий с файлом каталог?

Не то чтобы напрягаюсь, просто если можно что-то сделать простым способом, это лучше чем писать дополнительный код

MPB>>Значит, что эти функции многим людям нужны

ЕМ>Обычно они используются для более серьезных вещей.

Для каких например? Что в юзермоде нельзя сделать через CreateFile, а через NtCreateFile можно?
Re[23]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.07.20 11:42
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>В каком обратном? Проверить есть ли папка, потом проверять права?


Вы который день занимаетесь программированием? Не конкретно этой задачи, а вообще.

MPB>вы же на ровном месте костылями обкладываться предлагаете


Я предлагаю использовать средства, адекватные цели.

MPB>просто если можно что-то сделать простым способом, это лучше чем писать дополнительный код


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

MPB>Что в юзермоде нельзя сделать через CreateFile, а через NtCreateFile можно?


Например, нельзя открыть ресурс, имя которого содержит символы с кодом 0. У ядра такие ресурсы есть.
Re[13]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 11:53
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:


R>>у тс другая ситуация

R>>начинаем что то писать, ага какое писать с WriteFile ? бред

S>Начинаем с CreateFile() (а как ещё?)


Зачем, когда есть CopyFile/CopyFileEx/CopyFileTransacted?


R>>ну так начинаем писать имя файла которое может вдруг совпадать с именем диры которая там может быть


S>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config. И такого там заметно больше одного раза.


Да вроде с линупсом и фрёй в этом плане нет несовместимости. А вот когда я из гита выкачивал линупсовый проект под винду, то были проблемки с makefile vs Makefile. Повбывав бы


R>>бац

R>>надо наплевать и насильно переписать эту диру именно в имя такого файла

S>Он не спрашивал как переписать, он спрашивал, как понять, почему файл не создался.



Я бы построил список файлов для копирования, потом создал бы все пути, а потом копировал бы. Если исходник пропал — ну, выругался на него, и почапал дальше. Фар как-то так имхо и делает
Маньяк Робокряк колесит по городу
Re[15]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 11:54
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:


ЕМ>>Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.


S>Да, но Access Denied? Напомнило мне вот эту картинку —


S>Image: error-messages-small.jpg


Только C++ внезапно тут не причем
Маньяк Робокряк колесит по городу
Re[13]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 11:55
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?

MPB>Как ты собрался копировать файл без использования WriteFile?

А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?
Маньяк Робокряк колесит по городу
Re[17]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 11:58
Оценка:
Здравствуйте, MuPoB, Вы писали:


MPB>Я уже писал, какие ситуации могут быть — каталог закрыт на запись, и есть подпапка с таким именем. Может быть что-то ещё. Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile?

MPB>Понятно что все возможные случаи нельзя отловить, но в данном конкретном вместо AcceessDenied можно вернуть настоящую ошибку.


А что, разве нет функции NtWriteFile, которую можно использовать совместно с NtCreateFile, и нужен именно Win32-шный WriteFile?
Маньяк Робокряк колесит по городу
Re[14]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 15.07.20 11:59
Оценка:
Здравствуйте, Marty, Вы писали:

S>>Начинаем с CreateFile() (а как ещё?)


M>Зачем, когда есть CopyFile/CopyFileEx/CopyFileTransacted?


Если бы я писал файл менеджер, я писал бы свои функции, чтобы понимать точно, что внутри происходит.

S>>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config. И такого там заметно больше одного раза.


M>Да вроде с линупсом и фрёй в этом плане нет несовместимости. А вот когда я из гита выкачивал линупсовый проект под винду, то были проблемки с makefile vs Makefile. Повбывав бы


Ну да, я уже деталей особо не помню, но проблема есть, это точно.

M>Я бы построил список файлов для копирования, потом создал бы все пути, а потом копировал бы. Если исходник пропал — ну, выругался на него, и почапал дальше. Фар как-то так имхо и делает


Копировщик от фара — говняха ещё та. У него там где-то внутри время копирования как квадрат числа файлов, или что-то вроде того. Когда, скажем, сто тысяч файлов в директории, и нужно копировать на сеть, случаются проблемы.
Re[16]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 15.07.20 12:00
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Sharowarsheg, Вы писали:



ЕМ>>>Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.


S>>Да, но Access Denied? Напомнило мне вот эту картинку —


S>>Image: error-messages-small.jpg


M>Только C++ внезапно тут не причем


Не причем, но мне лень было перебивать тексты.
Re[15]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 12:08
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>>>Начинаем с CreateFile() (а как ещё?)


M>>Зачем, когда есть CopyFile/CopyFileEx/CopyFileTransacted?


S>Если бы я писал файл менеджер, я писал бы свои функции, чтобы понимать точно, что внутри происходит.


Но зачем?
У фара это опционально. Можно и так и так. Кстати, почему бы ТС не посмотреть сорцы фара? Он давно опенсорц


S>Копировщик от фара — говняха ещё та. У него там где-то внутри время копирования как квадрат числа файлов, или что-то вроде того.


Шта?

У него вполне адекватно. Хотя многое зависит от размера. Так, например, когда флешка не быстрая, и много мелких файлов, то это работает медленно. А большие файлы льются побыстрее. Он начинает мелкие копировать, и завышает общее время. Или наоборот, копирует большие и общее время занижается. Можно было бы получше расчет сделать с примерным учетом размеров файлов.


S>Когда, скажем, сто тысяч файлов в директории, и нужно копировать на сеть, случаются проблемы.


Когда 100500 тыщ мульенов в сеть — тут у кого хош проблемы будут
Маньяк Робокряк колесит по городу
Отредактировано 15.07.2020 12:10 Marty . Предыдущая версия .
Re[16]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 15.07.20 12:13
Оценка:
Здравствуйте, Marty, Вы писали:



S>>Копировщик от фара — говняха ещё та. У него там где-то внутри время копирования как квадрат числа файлов, или что-то вроде того.


M>Шта?


M>У него вполне адекватно. Хотя многое зависит от размера. Так, например, когда флешка не быстрая, и много мелких файлов, то это работает медленно. А большие файлы льются побыстрее. Он начинает мелкие копировать, и завышает общее время. Или наоборот, копирует большие и общее время занижается. Можно было бы получше расчет сделать с примерным учетом размеров файлов.



S>>Когда, скажем, сто тысяч файлов в директории, и нужно копировать на сеть, случаются проблемы.


M>Когда 100500 тыщ мульенов в сеть — тут у кого хош проблемы будут


Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.
Re[17]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.07.20 13:38
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.


Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.
Re[14]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 13:58
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, MuPoB, Вы писали:


MPB>>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?

MPB>>Как ты собрался копировать файл без использования WriteFile?

M>А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?


Если надо копировать с FTP например, эти функции не помогут. Ну и там прогресса нет, хотя первого пункта достаточно
Re[15]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 14:00
Оценка:
MPB>>>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?
MPB>>>Как ты собрался копировать файл без использования WriteFile?

M>>А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?


MPB>Если надо копировать с FTP например, эти функции не помогут. Ну и там прогресса нет, хотя первого пункта достаточно


Хотя в CopyFileEx прогресс есть. Тогда остаётся только первый пункт
Re[15]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 14:06
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>>>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?

MPB>>>Как ты собрался копировать файл без использования WriteFile?

M>>А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?


MPB>Если надо копировать с FTP например, эти функции не помогут. Ну и там прогресса нет, хотя первого пункта достаточно


Для прогресса есть CopyFileEx.

С FTP зело медленнее копировать, чем на локальных FS. Там вообще всё что угодно может произойти.
А чем тебя NtWriteFile не устраивает в пару к NtCreateFile, если уж на то пошло?
Маньяк Робокряк колесит по городу
Re[18]: CreateFile - AccessDenied когда существует папка
От: Sharowarsheg  
Дата: 15.07.20 14:55
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.


ЕМ>Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.


Запаковывать и распаковывать довольно долго тоже.
Re[24]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 16:08
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

MPB>>В каком обратном? Проверить есть ли папка, потом проверять права?

ЕМ>Вы который день занимаетесь программированием? Не конкретно этой задачи, а вообще.

4321-й день, плюс-минус. А вы который день?

MPB>>вы же на ровном месте костылями обкладываться предлагаете

ЕМ>Я предлагаю использовать средства, адекватные цели.

Это называется костыль. И работать он будет не всегда.

MPB>>просто если можно что-то сделать простым способом, это лучше чем писать дополнительный код

ЕМ>Вы уже написали дополнительный код, и потратили неоправданно много времени, так что соображения экономии не годятся.

Неоправданно много? А оправданно сколько можно времени тратить?
Изучение нового всегда какое-то время занимает. И что, не тратить его? Не проанализировать полностью проблему, остановиться на первом попавшемся способе, когда есть нормальный вариант?

MPB>>Что в юзермоде нельзя сделать через CreateFile, а через NtCreateFile можно?

ЕМ>Например, нельзя открыть ресурс, имя которого содержит символы с кодом 0. У ядра такие ресурсы есть.

Вот за это reversecode точно во все антивирусные базы добавит.
И что, майкрософт добавила в инклудники прототип функции чтобы проще было 0 в середину строки пихать?
Re[16]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 16:14
Оценка:
Здравствуйте, Marty, Вы писали:

M>С FTP зело медленнее копировать, чем на локальных FS. Там вообще всё что угодно может произойти.


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

M>А чем тебя NtWriteFile не устраивает в пару к NtCreateFile, если уж на то пошло?


NtWriteFile как ни странно не рекомендуется к использованию, не включена в заголовочный файл=)

А вообще я просто флаг FILE_SYNCHRONOUS_IO_NONALERT в NtCreateFile не выставил, поэтому NtWriteFile возвращала Pending, и результат окончания пришлось бы отдельно получать. С флагом FILE_SYNCHRONOUS_IO_NONALERT всё нормально стало и для обычного WriteFile, тут уже нет смысла Nt версию использовать
Re[18]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 16:25
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Sharowarsheg, Вы писали:


S>>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.


ЕМ>Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.


Действительно, зачем заморачиваться, что-то оптимизировать. Можно же говнокод катать, лишь бы время своё не тратить. А кому долго, пусть архивы делает
Re[17]: CreateFile - AccessDenied когда существует папка
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.07.20 16:26
Оценка:
Здравствуйте, MuPoB, Вы писали:


M>>А чем тебя NtWriteFile не устраивает в пару к NtCreateFile, если уж на то пошло?


MPB>NtWriteFile как ни странно не рекомендуется к использованию, не включена в заголовочный файл=)


MSDN говорит: Header: ntifs.h (include Wdm.h, Ntddk.h, Ntifs.h)


MPB>А вообще я просто флаг FILE_SYNCHRONOUS_IO_NONALERT в NtCreateFile не выставил, поэтому NtWriteFile возвращала Pending, и результат окончания пришлось бы отдельно получать. С флагом FILE_SYNCHRONOUS_IO_NONALERT всё нормально стало и для обычного WriteFile, тут уже нет смысла Nt версию использовать


Ну вот и ладненько
Маньяк Робокряк колесит по городу
Re[19]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 16:28
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Здравствуйте, Евгений Музыченко, Вы писали:


S>>>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.


ЕМ>>Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.


S>Запаковывать и распаковывать довольно долго тоже.


А если связь на 99% оборвётся, то и ладно. Будет пользователь заново 100Гб качать.
Re[25]: CreateFile - AccessDenied когда существует папка
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.07.20 16:35
Оценка:
Здравствуйте, MuPoB, Вы писали:

ЕМ>>Вы который день занимаетесь программированием? Не конкретно этой задачи, а вообще.


MPB>4321-й день, плюс-минус.


Странно, давно должно было наработаться понимание.

MPB>А вы который день?


Да сорок лет уже.

MPB>Это называется костыль.


Это называется "выяснение наиболее вероятной причины отказа".

MPB>И работать он будет не всегда.


Всегда вообще ничего не работает. Кстати, как с помощью NtCreateFile будете различать отсутствие записи в конкретный каталог, во все дерево, и в раздел целиком? А то пожалуется пользователь, что Ваш менеджер не сообщает об этом подробно — чем будете крыть?

MPB>Не проанализировать полностью проблему, остановиться на первом попавшемся способе, когда есть нормальный вариант?


Полностью Вы ее в любом случае не анализируете.

MPB>И что, майкрософт добавила в инклудники прототип функции чтобы проще было 0 в середину строки пихать?


Почему Вы спрашиваете об этом меня? Спросите у них.
Re[18]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 16:36
Оценка:
Здравствуйте, Marty, Вы писали:

M>>>А чем тебя NtWriteFile не устраивает в пару к NtCreateFile, если уж на то пошло?

MPB>>NtWriteFile как ни странно не рекомендуется к использованию, не включена в заголовочный файл=)
M>MSDN говорит: Header: ntifs.h (include Wdm.h, Ntddk.h, Ntifs.h)

ntifs.h это уже из DDK, как я понял. В инклудниках которые вместе со студией ставились, его нет. Ну это уже несущественно)
Re[26]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 15.07.20 16:47
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


MPB>>Это называется костыль.

ЕМ>Это называется "выяснение наиболее вероятной причины отказа".

Зачем выяснять наиболее вероятную, когда есть точная? Если бы не было, тогда конечно, пришлось бы так делать.

MPB>>И работать он будет не всегда.


ЕМ>Всегда вообще ничего не работает. Кстати, как с помощью NtCreateFile будете различать отсутствие записи в конкретный каталог, во все дерево, и в раздел целиком? А то пожалуется пользователь, что Ваш менеджер не сообщает об этом подробно — чем будете крыть?


Пользовательский сценарий какой в этом случае? Пользователь обычно не знает про разделы и деревья, он знает про диски, файлы и папки

MPB>>Не проанализировать полностью проблему, остановиться на первом попавшемся способе, когда есть нормальный вариант?

ЕМ>Полностью Вы ее в любом случае не анализируете.

Но лучше обрабатывать 40% случаев, чем 35%

MPB>>И что, майкрософт добавила в инклудники прототип функции чтобы проще было 0 в середину строки пихать?

ЕМ>Почему Вы спрашиваете об этом меня? Спросите у них.

Потому что вы не хотите признать, что МС делает Nt функции всё более доступными для обычных программистов. Не для каких-то редких случаев, когда можно было адрес запросить, и этого было бы достаточно.
Вот например, раньше нельзя было переименовать открытый файл, нужно было Nt функцию использовать. А сейчас появился Win32 аналог для этого. Значит, много кому это было нужно.
Если бы CreateFile возвращал нормальную ошибку, то и проблем бы не было. Но её уже нельзя исправить, зато теперь доступен NtCreateFile для такого случая
Re[19]: CreateFile - AccessDenied когда существует папка
От: Alexander G Украина  
Дата: 16.07.20 05:46
Оценка:
Здравствуйте, MuPoB, Вы писали:

MPB>ntifs.h это уже из DDK, как я понял. В инклудниках которые вместе со студией ставились, его нет. Ну это уже несущественно)


В <winternl.h> нет?
Русский военный корабль идёт ко дну!
Re[20]: CreateFile - AccessDenied когда существует папка
От: MuPoB  
Дата: 16.07.20 16:48
Оценка:
Здравствуйте, Alexander G, Вы писали:

MPB>>ntifs.h это уже из DDK, как я понял. В инклудниках которые вместе со студией ставились, его нет. Ну это уже несущественно)

AG>В <winternl.h> нет?

Нет, хотя NtCreateFile есть в <winternl.h>. Видимо были какие-то причины у МС не помещать NtWriteFile в него. Но NtWriteFile и не нужна, WriteFile достаточно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.