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++ внезапно тут не причем
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.