Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Для файлового менеджера, управляемого вручную, подобная эквилибристика совершенно избыточна. Достаточно вывести системное сообщение об ошибке, снабдив его рекомендацией проверить то-то и то-то.
Вот именно, надо вывести нормальную ошибку с рекомендацией сохранить под другим именем. Но ни один файловый менеджер не показывает это, Проводник хотя бы говорит, что папка есть с таким именем, но не предлагает сохранить файл под другим именем. А остальные менеджеры вообще фигню показывают
Re[10]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Sharowarsheg, Вы писали:
S>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config.
Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.
Re[13]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?
Именно так, а в комментарии "от себя" указать наиболее вероятные причины. Описанные проблемы, при адекватном использовании любого файлового менеджера, возникают редко. Нет никакого практического смысла пытаться обработать все подобные случаи в автоматическом режиме — продвинутому пользователю это не особо поможет, а обычный все равно не поймет.
Re[14]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, MuPoB, Вы писали:
MPB>>нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander?
ЕМ>Именно так, а в комментарии "от себя" указать наиболее вероятные причины. Описанные проблемы, при адекватном использовании любого файлового менеджера, возникают редко. Нет никакого практического смысла пытаться обработать все подобные случаи в автоматическом режиме — продвинутому пользователю это не особо поможет, а обычный все равно не поймет.
Так и нужно в ручном, чтобы пользователь выбрал. Просто если будет ошибка AccessDenied — тут особых вариантов нет, только пропустить или попытаться повторить, а если конфликт имени с папкой — это другое, и тут можно сразу предложить использовать другое имя.
Просто если есть возможность сразу понять причину ошибки, не прибегая к каким-то вероятностным вычислениям, то ей и нужно пользоваться
Re[15]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>Так и нужно в ручном, чтобы пользователь выбрал. Просто если будет ошибка AccessDenied — тут особых вариантов нет, только пропустить или попытаться повторить, а если конфликт имени с папкой — это другое, и тут можно сразу предложить использовать другое имя.
Ну так и проверяйте программно, существует такой каталог, или нет. Для подавляющего большинства ситуаций, кроме ничтожной части весьма специфических, этого будет достаточно. Вместо этого Вы, под эгидой крайнего перфекционизма, хотите странного. Это и порождает закономерные вопросы о том, для чего это может быть нужно. Всех возможных комбинаций исходных данных и результатов Вы в любом случае предусмотреть не сможете. Отчего Вас заело именно на этой?
Re[16]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, MuPoB, Вы писали:
MPB>>Так и нужно в ручном, чтобы пользователь выбрал. Просто если будет ошибка AccessDenied — тут особых вариантов нет, только пропустить или попытаться повторить, а если конфликт имени с папкой — это другое, и тут можно сразу предложить использовать другое имя.
ЕМ>Ну так и проверяйте программно, существует такой каталог, или нет. Для подавляющего большинства ситуаций, кроме ничтожной части весьма специфических, этого будет достаточно. Вместо этого Вы, под эгидой крайнего перфекционизма, хотите странного. Это и порождает закономерные вопросы о том, для чего это может быть нужно. Всех возможных комбинаций исходных данных и результатов Вы в любом случае предусмотреть не сможете. Отчего Вас заело именно на этой?
Я уже писал, какие ситуации могут быть — каталог закрыт на запись, и есть подпапка с таким именем. Может быть что-то ещё. Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile?
Понятно что все возможные случаи нельзя отловить, но в данном конкретном вместо AcceessDenied можно вернуть настоящую ошибку.
Или вы тоже сторонник полного запрета Nt функций в прикладном коде? Тогда пишите в майкрософт, а то они совсем распоясались, уже в заголовочные файлы их включают
Re[17]: CreateFile - AccessDenied когда существует папка
. Фактически, Вы уже потратили на все это в несколько раз больше времени, чем было достаточно для разумного решения проблемы, что и вызывает закономерное непонимание.
MPB>Понятно что все возможные случаи нельзя отловить, но в данном конкретном вместо AcceessDenied можно вернуть настоящую ошибку.
Сколько раз лично Вы или Ваши пользователи сталкивались с ситуацией, когда лишь использование атомарной операции вроде NtCreateFile позволило что-то радикально изменить в последовательности действий?
MPB>Или вы тоже сторонник полного запрета Nt функций в прикладном коде?
Я сторонник разумного использования средств, не предназначенных для прикладных программистов.
Re[14]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Sharowarsheg, Вы писали:
S>>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config.
ЕМ>Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.
Да, но Access Denied? Напомнило мне вот эту картинку —
Re[15]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, MuPoB, Вы писали:
MPB>>Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile?
ЕМ>"Что-то дополнительное выдумывать" — это как раз использовать NtCreateFile и затем бороться с ее особенностями
. Фактически, Вы уже потратили на все это в несколько раз больше времени, чем было достаточно для разумного решения проблемы, что и вызывает закономерное непонимание.
Как раз нет, вот ловить ошибку AccessDenied и гадать, что случилось на самом деле будет сложнее, чем один раз (один раз, Карл!) разобраться с NtCreateFile
ЕМ>Сколько раз лично Вы или Ваши пользователи сталкивались с ситуацией, когда лишь использование атомарной операции вроде NtCreateFile позволило что-то радикально изменить в последовательности действий?
Да причём тут атомарная/неатомарная, если даже для случая с запретом записи в каталог нельзя понять причину ошибки?
Вообще конкретно с этим случаем я не сталкивался, но это не значит, что он невозможен. Просто на винде обычно у файлов есть расширения, и таких конфликтов обычно не бывает. Но при копировании с линукса например, это более вероятно
MPB>>Или вы тоже сторонник полного запрета Nt функций в прикладном коде?
ЕМ>Я сторонник разумного использования средств, не предназначенных для прикладных программистов.
Если функция документирована, включена в заголовочный файл, значит, она предназначена для использования в прикладном коде
Re[19]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>ловить ошибку AccessDenied и гадать, что случилось на самом деле
Не нужно ни о чем гадать, нужно просто выполнить пару-тройку дополнительных операций. Это вполне типичная в программировании ситуация, когда возвращаемый код не позволяет однозначно определить проблему.
MPB>Вообще конкретно с этим случаем я не сталкивался, но это не значит, что он невозможен.
Если Вы пытаетесь охватить все возможные случаи, то безусловно потерпите неудачу.
MPB>Просто на винде обычно у файлов есть расширения, и таких конфликтов обычно не бывает. Но при копировании с линукса например, это более вероятно
При копировании с других ФС принципиально невозможно получить адекватную копию в полностью автоматическом режиме. В каждом подобном случае необходимо ручное вмешательство. Что давно и успешно делают архиваторы, умеющие распаковывать такие структуры.
MPB>Если функция документирована, включена в заголовочный файл, значит, она предназначена для использования в прикладном коде
Она документирована с соответствующей пометкой. И в winternl.h тоже есть соответствующее предупреждение. Это говорит о том, что эти средства следует использовать лишь при реальной необходимости — например, для обращения к объектам, связаться с которыми через CreateFile невозможно в принципе.
Re[16]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Sharowarsheg, Вы писали:
S>>Да, но Access Denied?
ЕМ>Согласен, неудачный код для такой ситуации. Какой-нибудь "name conflict" подошел бы лучше.
ЕМ>Кстати, а *nix'ы что возвращают в такой ситуации?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, MuPoB, Вы писали:
MPB>>ловить ошибку AccessDenied и гадать, что случилось на самом деле ЕМ>Не нужно ни о чем гадать, нужно просто выполнить пару-тройку дополнительных операций. Это вполне типичная в программировании ситуация, когда возвращаемый код не позволяет однозначно определить проблему.
То есть на полном серьёзе предлагается сначала запросить является ли диск доступным для записи, потом определить, есть ли права у пользователя на запись, потом поискать, есть ли папка с таким именем, и всё только потому что страшно вызвать NtCreateFile и проверить код возврата?
MPB>>Вообще конкретно с этим случаем я не сталкивался, но это не значит, что он невозможен. ЕМ>Если Вы пытаетесь охватить все возможные случаи, то безусловно потерпите неудачу.
Какие все? Есть конкретный случай, он один
MPB>>Просто на винде обычно у файлов есть расширения, и таких конфликтов обычно не бывает. Но при копировании с линукса например, это более вероятно ЕМ>При копировании с других ФС принципиально невозможно получить адекватную копию в полностью автоматическом режиме. В каждом подобном случае необходимо ручное вмешательство. Что давно и успешно делают архиваторы, умеющие распаковывать такие структуры.
Опять какой-то автоматический режим. Откуда он взялся? Все конфликты будут разруливаться в ручном режиме.
MPB>>Если функция документирована, включена в заголовочный файл, значит, она предназначена для использования в прикладном коде ЕМ>Она документирована с соответствующей пометкой. И в winternl.h тоже есть соответствующее предупреждение. Это говорит о том, что эти средства следует использовать лишь при реальной необходимости — например, для обращения к объектам, связаться с которыми через CreateFile невозможно в принципе.
Да, понятно что нужно аккуратно всё использовать, но зачем вообще майкрософт добавила эти функции в заголовочный файл? Почему не оставила всё как раньше, чтобы получать через GetProcAddress? Значит, что эти функции многим людям нужны, возможно что мой случай как раз из таких
Re[21]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>То есть на полном серьёзе предлагается сначала запросить является ли диск доступным для записи, потом определить, есть ли права у пользователя на запись, потом поискать, есть ли папка с таким именем
Нет, предлагается делать это в обратном порядке.
MPB>и всё только потому что страшно вызвать NtCreateFile и проверить код возврата?
Кому страшно?
MPB>Все конфликты будут разруливаться в ручном режиме.
Тогда почему Вы напрягаетесь, что кто-то может выдернуть у Вас из-под носа конфликтующий с файлом каталог?
MPB>Значит, что эти функции многим людям нужны
Обычно они используются для более серьезных вещей.
Re[22]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
MPB>>То есть на полном серьёзе предлагается сначала запросить является ли диск доступным для записи, потом определить, есть ли права у пользователя на запись, потом поискать, есть ли папка с таким именем ЕМ>Нет, предлагается делать это в обратном порядке.
В каком обратном? Проверить есть ли папка, потом проверять права? И зачем такие костыли? Т.е. в любом случае если есть папка, это не значит, что будет ошибка конфликта имён, потому что может не быть права на запись, и тут уже настоящий AccessDenied
MPB>>и всё только потому что страшно вызвать NtCreateFile и проверить код возврата? ЕМ>Кому страшно?
Вам например, вы же на ровном месте костылями обкладываться предлагаете
MPB>>Все конфликты будут разруливаться в ручном режиме. ЕМ>Тогда почему Вы напрягаетесь, что кто-то может выдернуть у Вас из-под носа конфликтующий с файлом каталог?
Не то чтобы напрягаюсь, просто если можно что-то сделать простым способом, это лучше чем писать дополнительный код
MPB>>Значит, что эти функции многим людям нужны ЕМ>Обычно они используются для более серьезных вещей.
Для каких например? Что в юзермоде нельзя сделать через CreateFile, а через NtCreateFile можно?
Re[23]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>В каком обратном? Проверить есть ли папка, потом проверять права?
Вы который день занимаетесь программированием? Не конкретно этой задачи, а вообще.
MPB>вы же на ровном месте костылями обкладываться предлагаете
Я предлагаю использовать средства, адекватные цели.
MPB>просто если можно что-то сделать простым способом, это лучше чем писать дополнительный код
Вы уже написали дополнительный код, и потратили неоправданно много времени, так что соображения экономии не годятся.
MPB>Что в юзермоде нельзя сделать через CreateFile, а через NtCreateFile можно?
Например, нельзя открыть ресурс, имя которого содержит символы с кодом 0. У ядра такие ресурсы есть.
Re[13]: CreateFile - AccessDenied когда существует папка
R>>у тс другая ситуация R>>начинаем что то писать, ага какое писать с WriteFile ? бред
S>Начинаем с CreateFile() (а как ещё?)
Зачем, когда есть CopyFile/CopyFileEx/CopyFileTransacted?
R>>ну так начинаем писать имя файла которое может вдруг совпадать с именем диры которая там может быть
S>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config. И такого там заметно больше одного раза.
Да вроде с линупсом и фрёй в этом плане нет несовместимости. А вот когда я из гита выкачивал линупсовый проект под винду, то были проблемки с makefile vs Makefile. Повбывав бы
R>>бац R>>надо наплевать и насильно переписать эту диру именно в имя такого файла
S>Он не спрашивал как переписать, он спрашивал, как понять, почему файл не создался.
Я бы построил список файлов для копирования, потом создал бы все пути, а потом копировал бы. Если исходник пропал — ну, выругался на него, и почапал дальше. Фар как-то так имхо и делает
ЕМ>>Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.
S>Да, но Access Denied? Напомнило мне вот эту картинку —
S>Image: error-messages-small.jpg