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> нет?
Русский военный корабль идёт ко дну!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.