Здравствуйте, MuPoB, Вы писали:
MPB>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander? MPB>Как ты собрался копировать файл без использования WriteFile?
А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?
MPB>Я уже писал, какие ситуации могут быть — каталог закрыт на запись, и есть подпапка с таким именем. Может быть что-то ещё. Зачем что-то дополнительно выдумывать, если единственное что надо — вместо CreateFile вызвать NtCreateFile? MPB>Понятно что все возможные случаи нельзя отловить, но в данном конкретном вместо AcceessDenied можно вернуть настоящую ошибку.
А что, разве нет функции NtWriteFile, которую можно использовать совместно с NtCreateFile, и нужен именно Win32-шный WriteFile?
Здравствуйте, Marty, Вы писали:
S>>Начинаем с CreateFile() (а как ещё?)
M>Зачем, когда есть CopyFile/CopyFileEx/CopyFileTransacted?
Если бы я писал файл менеджер, я писал бы свои функции, чтобы понимать точно, что внутри происходит.
S>>Например, если с линуксовой шары тащить исходник FreeBSD, кажется, или чего-то ещё такого рода, я уж забыл за давностью, там есть интересная проблема с тем, что есть одновременно директория и файл, с именами типа Config и config. И такого там заметно больше одного раза.
M>Да вроде с линупсом и фрёй в этом плане нет несовместимости. А вот когда я из гита выкачивал линупсовый проект под винду, то были проблемки с makefile vs Makefile. Повбывав бы
Ну да, я уже деталей особо не помню, но проблема есть, это точно.
M>Я бы построил список файлов для копирования, потом создал бы все пути, а потом копировал бы. Если исходник пропал — ну, выругался на него, и почапал дальше. Фар как-то так имхо и делает
Копировщик от фара — говняха ещё та. У него там где-то внутри время копирования как квадрат числа файлов, или что-то вроде того. Когда, скажем, сто тысяч файлов в директории, и нужно копировать на сеть, случаются проблемы.
Re[16]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, Sharowarsheg, Вы писали:
ЕМ>>>Ну дык, надо представлять себе возможные последствия тупого копирования между разными ФС. Ни один универсальный менеджер неспособен разрешить их все в автоматическом режиме.
S>>Да, но Access Denied? Напомнило мне вот эту картинку —
S>>Image: error-messages-small.jpg
M>Только C++ внезапно тут не причем
Не причем, но мне лень было перебивать тексты.
Re[15]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Sharowarsheg, Вы писали:
S>>>Начинаем с CreateFile() (а как ещё?)
M>>Зачем, когда есть CopyFile/CopyFileEx/CopyFileTransacted?
S>Если бы я писал файл менеджер, я писал бы свои функции, чтобы понимать точно, что внутри происходит.
Но зачем?
У фара это опционально. Можно и так и так. Кстати, почему бы ТС не посмотреть сорцы фара? Он давно опенсорц
S>Копировщик от фара — говняха ещё та. У него там где-то внутри время копирования как квадрат числа файлов, или что-то вроде того.
Шта?
У него вполне адекватно. Хотя многое зависит от размера. Так, например, когда флешка не быстрая, и много мелких файлов, то это работает медленно. А большие файлы льются побыстрее. Он начинает мелкие копировать, и завышает общее время. Или наоборот, копирует большие и общее время занижается. Можно было бы получше расчет сделать с примерным учетом размеров файлов.
S>Когда, скажем, сто тысяч файлов в директории, и нужно копировать на сеть, случаются проблемы.
Когда 100500 тыщ мульенов в сеть — тут у кого хош проблемы будут
S>>Копировщик от фара — говняха ещё та. У него там где-то внутри время копирования как квадрат числа файлов, или что-то вроде того.
M>Шта?
M>У него вполне адекватно. Хотя многое зависит от размера. Так, например, когда флешка не быстрая, и много мелких файлов, то это работает медленно. А большие файлы льются побыстрее. Он начинает мелкие копировать, и завышает общее время. Или наоборот, копирует большие и общее время занижается. Можно было бы получше расчет сделать с примерным учетом размеров файлов.
S>>Когда, скажем, сто тысяч файлов в директории, и нужно копировать на сеть, случаются проблемы.
M>Когда 100500 тыщ мульенов в сеть — тут у кого хош проблемы будут
Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.
Re[17]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Sharowarsheg, Вы писали:
S>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.
Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.
Re[14]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, MuPoB, Вы писали:
MPB>>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander? MPB>>Как ты собрался копировать файл без использования WriteFile?
M>А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?
Если надо копировать с FTP например, эти функции не помогут. Ну и там прогресса нет, хотя первого пункта достаточно
Re[15]: CreateFile - AccessDenied когда существует папка
MPB>>>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander? MPB>>>Как ты собрался копировать файл без использования WriteFile?
M>>А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?
MPB>Если надо копировать с FTP например, эти функции не помогут. Ну и там прогресса нет, хотя первого пункта достаточно
Хотя в CopyFileEx прогресс есть. Тогда остаётся только первый пункт
Re[15]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>>>Для альтернативно одарённых — нужно копировать файл из одной папки в другую. Но в ней может быть подпапка с таким же именем. И что пользователю показать? AccessDenied, как в TotalCommander? MPB>>>Как ты собрался копировать файл без использования WriteFile?
M>>А CopyFile/CopyFileEx/CopyFileTransacted не пробовал?
MPB>Если надо копировать с FTP например, эти функции не помогут. Ну и там прогресса нет, хотя первого пункта достаточно
Для прогресса есть CopyFileEx.
С FTP зело медленнее копировать, чем на локальных FS. Там вообще всё что угодно может произойти.
А чем тебя NtWriteFile не устраивает в пару к NtCreateFile, если уж на то пошло?
Здравствуйте, Евгений Музыченко, Вы писали:
S>>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.
ЕМ>Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.
Запаковывать и распаковывать довольно долго тоже.
Re[24]: CreateFile - AccessDenied когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
MPB>>В каком обратном? Проверить есть ли папка, потом проверять права? ЕМ>Вы который день занимаетесь программированием? Не конкретно этой задачи, а вообще.
4321-й день, плюс-минус. А вы который день?
MPB>>вы же на ровном месте костылями обкладываться предлагаете ЕМ>Я предлагаю использовать средства, адекватные цели.
Это называется костыль. И работать он будет не всегда.
MPB>>просто если можно что-то сделать простым способом, это лучше чем писать дополнительный код ЕМ>Вы уже написали дополнительный код, и потратили неоправданно много времени, так что соображения экономии не годятся.
Неоправданно много? А оправданно сколько можно времени тратить?
Изучение нового всегда какое-то время занимает. И что, не тратить его? Не проанализировать полностью проблему, остановиться на первом попавшемся способе, когда есть нормальный вариант?
MPB>>Что в юзермоде нельзя сделать через CreateFile, а через NtCreateFile можно? ЕМ>Например, нельзя открыть ресурс, имя которого содержит символы с кодом 0. У ядра такие ресурсы есть.
Вот за это reversecode точно во все антивирусные базы добавит.
И что, майкрософт добавила в инклудники прототип функции чтобы проще было 0 в середину строки пихать?
Re[16]: CreateFile - AccessDenied когда существует папка
Здравствуйте, 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 когда существует папка
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Sharowarsheg, Вы писали:
S>>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.
ЕМ>Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.
Действительно, зачем заморачиваться, что-то оптимизировать. Можно же говнокод катать, лишь бы время своё не тратить. А кому долго, пусть архивы делает
Re[17]: CreateFile - AccessDenied когда существует папка
M>>А чем тебя NtWriteFile не устраивает в пару к NtCreateFile, если уж на то пошло?
MPB>NtWriteFile как ни странно не рекомендуется к использованию, не включена в заголовочный файл=)
MPB>А вообще я просто флаг FILE_SYNCHRONOUS_IO_NONALERT в NtCreateFile не выставил, поэтому NtWriteFile возвращала Pending, и результат окончания пришлось бы отдельно получать. С флагом FILE_SYNCHRONOUS_IO_NONALERT всё нормально стало и для обычного WriteFile, тут уже нет смысла Nt версию использовать
Здравствуйте, Sharowarsheg, Вы писали:
S>Здравствуйте, Евгений Музыченко, Вы писали:
S>>>Нет, у Windows Explorer никаких проблем не было. Он спокойно с линейной скоростью за несколько часов скопировал. FAR, бедолага, за двое суток дошёл до половины и встал.
ЕМ>>Подозреваю, что архив с теми файлами скопировался бы за полчаса и там, и там.
S>Запаковывать и распаковывать довольно долго тоже.
А если связь на 99% оборвётся, то и ладно. Будет пользователь заново 100Гб качать.
Re[25]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
ЕМ>>Вы который день занимаетесь программированием? Не конкретно этой задачи, а вообще.
MPB>4321-й день, плюс-минус.
Странно, давно должно было наработаться понимание.
MPB>А вы который день?
Да сорок лет уже.
MPB>Это называется костыль.
Это называется "выяснение наиболее вероятной причины отказа".
MPB>И работать он будет не всегда.
Всегда вообще ничего не работает. Кстати, как с помощью NtCreateFile будете различать отсутствие записи в конкретный каталог, во все дерево, и в раздел целиком? А то пожалуется пользователь, что Ваш менеджер не сообщает об этом подробно — чем будете крыть?
MPB>Не проанализировать полностью проблему, остановиться на первом попавшемся способе, когда есть нормальный вариант?
Полностью Вы ее в любом случае не анализируете.
MPB>И что, майкрософт добавила в инклудники прототип функции чтобы проще было 0 в середину строки пихать?
Почему Вы спрашиваете об этом меня? Спросите у них.
Re[18]: CreateFile - AccessDenied когда существует папка
Здравствуйте, 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 когда существует папка
MPB>>Это называется костыль. ЕМ>Это называется "выяснение наиболее вероятной причины отказа".
Зачем выяснять наиболее вероятную, когда есть точная? Если бы не было, тогда конечно, пришлось бы так делать.
MPB>>И работать он будет не всегда.
ЕМ>Всегда вообще ничего не работает. Кстати, как с помощью NtCreateFile будете различать отсутствие записи в конкретный каталог, во все дерево, и в раздел целиком? А то пожалуется пользователь, что Ваш менеджер не сообщает об этом подробно — чем будете крыть?
Пользовательский сценарий какой в этом случае? Пользователь обычно не знает про разделы и деревья, он знает про диски, файлы и папки
MPB>>Не проанализировать полностью проблему, остановиться на первом попавшемся способе, когда есть нормальный вариант? ЕМ>Полностью Вы ее в любом случае не анализируете.
Но лучше обрабатывать 40% случаев, чем 35%
MPB>>И что, майкрософт добавила в инклудники прототип функции чтобы проще было 0 в середину строки пихать? ЕМ>Почему Вы спрашиваете об этом меня? Спросите у них.
Потому что вы не хотите признать, что МС делает Nt функции всё более доступными для обычных программистов. Не для каких-то редких случаев, когда можно было адрес запросить, и этого было бы достаточно.
Вот например, раньше нельзя было переименовать открытый файл, нужно было Nt функцию использовать. А сейчас появился Win32 аналог для этого. Значит, много кому это было нужно.
Если бы CreateFile возвращал нормальную ошибку, то и проблем бы не было. Но её уже нельзя исправить, зато теперь доступен NtCreateFile для такого случая
Re[19]: CreateFile - AccessDenied когда существует папка
Здравствуйте, MuPoB, Вы писали:
MPB>ntifs.h это уже из DDK, как я понял. В инклудниках которые вместе со студией ставились, его нет. Ну это уже несущественно)