View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000246 | Far Manager | Delete files/folders | public | 2006-11-02 01:28 | 2010-05-02 20:45 |
Reporter | DiRTy_GaRRy | Assigned To | DiRTy_GaRRy | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | x86 | OS | Windows | OS Version | XP SP2 |
Fixed in Version | 2.0 | ||||
Summary | 0000246: Нет возможности работать с папками оканчивающимися на пробел | ||||
Description | FAR не может производить никаких операций с папками оканчивающимися на пробелы (NTFS). Т.е. в такую папку нельзя зайти, её нельзя удалить или переименовать. Хотелось бы что бы с такими папками можно было делать стандартные операции, как то удаление/копироване/переименование/заход. | ||||
Steps To Reproduce | 1. Запускаем FAR; 2. Создаём папку при помощи команды md "Folder \"; 3. Пытаемся что-либо сделать с такой папкой и у нас это не получается. | ||||
Tags | No tags attached. | ||||
Build | 0 | ||||
|
Удалить можно. |
|
Zuz, да, действительно, по Shift+Del удаллить можно, а при удалении в корзину FAR даже ошибки не выдаёт (впрочем, может это ограничения shell-х функций). |
|
Как создать такую папку? Через md "1 " не получилось. |
|
cos, я же в "Steps To Reproduce " написал как. :) P.S. md "1 \" |
|
Это известная баго-фича WinAPI GetFullPathName. Вот минимальный код, воспроизводящий ее: int main( int, char **, char ** ) { char *ptr; char *strFolder = "P:\\Test\\Folder "; int nSize = GetFullPathName( strFolder, 0, NULL, &ptr ); char *strConverted = new char[nSize]; GetFullPathName( strFolder, nSize, strConverted, &ptr ); std::cout << "Original - <" << strFolder << "> Size=" << strlen( strFolder ) << std::endl; std::cout << "Converted - <" << strConverted << "> Size=" << strlen( strConverted ) << ' ' << "Real Size=" << nSize << std::endl; delete[] strConverted; return 0; } Original - <P:\Test\Folder > Size=15 Converted - <P:\Test\Folder> Size=14 Real Size=15 Попробую приготовить Fix... |
|
Fix подготовил... То что я нашел - это нельзя создать каталог с пробелом в конце. Ну и желательно протестировать - вариантов много.... |
|
А положить все файлы в один архив ни как незя было? |
|
Пардон, это прога отработала. Я же лентяй -:) Пришлось на nncron скриптик нарисовать - сейчас исправлю. |
|
Я всё жду всех файлов (exe не надо) в одном архиве. |
2007-11-23 07:09
|
|
|
Загрузил - 246.7z У меня нет прав на удаление файлов... |
|
У патча есть несколько мелких проблем со стилем: 1. Ты там сделал все функи с префиксом Far (типа FarGetFileAttributes), этот префикс используется только для функций которые доступны из плагинов. В твоём случае тебе надо сделать их с префиксом api как ты и сам видел есть уже в коде. Ну и за одно нафига было делать отдельный FarMoveFile если уже есть apiMoveFile и можно всё сделать в нём. И ложить их надо в farwinapi.cpp а не в mix.cpp. 2. Префикс str используется для строка типа string (UnicodeString) а не для wchar *, для таких строк или префикс lpwsz или тупо без префикса. 3. Вместо wcscmp у нас используется StrCmp (смотри файл UNICODE). 4. Вот такие вещи (у тебя в пару мест) делать вообще не надо: ! wchar_t *strNameSlash = new wchar_t[wcslen( Name ) + 1 + 1]; ! wcscpy( strNameSlash, Name ); ! AddEndSlash( strNameSlash ); надо делать вот так: string strNameSlash = Name; AddEndSlash(strNameSlash); Прошу исправить всё под общий стиль как я описал. Жду. |
|
Если в конце не один пробел, а два и больше, зайти по-прежнему нельзя. |
|
За выходные исправлю... А вот с двумя пробелами интересно -(: Хоть я и сам работник Microsoft, но КАК я "ЛЮБЛЮ" WinAPI!!!!!!!! |
|
Как будет время, поулаляй, pls, лишние файлы. Чтобы перед глазами не мелькали... |
|
Ты тут нафигачил их а мне удалять :) |
|
Дык, у меня прав на удаление нет -(: |
|
Oleg Bekhter: как дела? То, что здесь приаттачено - работоспособно? |
|
Оно работоспособно но не совсем вписывается в наш код. Он скоро выложит новый патч. |
|
Извиняюсь за задержку - конец месяца. Авралы в конце месяца, оказывается, не только в СовДепии бывают -:) |
2007-12-01 04:32
|
|
|
Кстати, работу с folders с двумя и больше пробелами на конце исправил... |
|
Ты вообще читал то что я тебе писал вверху? Ты исправил тока префикс api, всё остальное осталось и даже стало хуже. |
|
А что все остальное. Все логику я перевел в farwinapi.cpp. Prefix переменных исправил там, где я использую строки использую, как указано. Вся работа со строками реализована на string (UnicodeString) Сравнение использую через внутренние функции. И т.д. Что не правильно? |
|
Пункты 2 и 4 сверху. С префиксами ты там вообще намутил, придумал какой то префикс wsz для string вместо того чтоб юзать префикс str. Ну и доп. не нравится мне твой FileNameConvert но это уже мелочь, сам переделаю когда доделаешь всё остальное. |
|
это вроде исправили, не? |
|
1. Удаление в корзину директорий с пробелами в конце как и раньше молча не работает (забыли добавить \0\0 во вторую попытку. Могу дать патч); 2. Если SHFileOperation возвращает неизвестную ошибку, то никакой диалог об ошибку не показывается. |
2009-02-11 14:43
|
SHFileOperation.patch (622 bytes)
Index: delete.cpp =================================================================== --- delete.cpp (revision 2563) +++ delete.cpp (working copy) @@ -770,9 +770,13 @@ string strFullNameAlt; strFullNameAlt.Format (L"\\\\?\\%s",(const wchar_t*)strFullName); + lpwszName = strFullNameAlt.GetBuffer (strFullNameAlt.GetLength()+2); + lpwszName[strFullNameAlt.GetLength()+1] = 0; //dirty trick to make strFullName end with DOUBLE zero!!! - fop.pFrom=strFullNameAlt; + fop.pFrom=lpwszName; RetCode=SHFileOperationW(&fop); + + strFullNameAlt.ReleaseBuffer(); } #endif |
|
В общем, к 1. патч прикрепил. |
|
> 1. Удаление в корзину директорий с пробелами в конце как и раньше молча не работает (забыли добавить \0\0 во вторую попытку. Могу дать патч); Хм, а у тебя что, эта "вторая попытка" работает? У меня SHFileOperationW с префиксным путем возвращает 0x7с, что, согласно Писанию, следует понимать как "The path in the source or destination or both was invalid." |
|
DrKnS, с моим патчем — работает. P.S. Windows Server 2003 R2 SP2. |
|
> P.S. Windows Server 2003 R2 SP2. Ясно, значит это висту погнули. |
|
DrKnS, надо будет посмотреть. |
|
Спасибо. Сделали. Почитал TODO. Может, действительно, не париться и использовать при ошибке apiDeleteFile. А по поводу IFileOperation под Vista… Что то мне подсказывает, что оно как и старые shell-е функции не будет работать с такими папками/файлами. Кстати, может стоит проверять наличие в конце пути пробела? А то мы можем нарваться на то, что файл/папка не удалились по какой-либо другой причине, а потом эта причина пропала, а мы из-за этого грохаем файл перманентно. Могу сделать патчик. ;) P.S. Кстати, в последнем патче имеется мешанина из табов и пробелов. |
|
Я вот тоже думаю, что если не смогли удалить в корзину, то надо делать apiDeleteFile, возможно, с дополнительным подтверждением типа "в корзину ниасилил, удалить насовсем? Да/Нет" Про "не удалились по какой-либо другой причине, а потом эта причина пропала" - не совсем понял, что имелось в виду, давай примеры. А мешанина из пробелов и табов- это "нормально". Сейчас ориентация на табы, но, дабы не повышать энтропию Вселенной, замена производится не глобально, а постепенно :) |
|
DrKnS, по поводу пропадаения причины. Допустим, мы пытаемся удалить папку, но обламываемся из-за нарушения совместного доступа. Так удаление при этом проходит не мгновенно (система какое-то время думает, а потом только выдаёт ошибку), то мы можем за это время, например, выйти из папки и конфликт разрешиться. Соответсвенно, после окончания задумчивости мы переходим ко второму условию и успешно удаляем папку минуя корзину. Возможно два выхода из данной ситуации: 1. Делать вторую попытку через обычное удаление только для папок оканчивающихся на пробел, так как такие папки всё рано обычными средствами пока не удалить. 2. Анализировать код возврата и делать вторую попытку через обычное удаление только для 0x402 (pre Vista системы) и для 0x7C (Vista и выше системы). После некоторых размышлений я склоняюсь ко второму варианту, так как он более корректен. |
|
Кстати, вторую попытку так же можно делать для кодов ошибок связанных с MAX_PATH (судя по мсдн это 0x79, 0x81 и 0xB7), тогда минуя корзину будет удаляться всё за MAX_PATH. |
|
Это уже вроде можно закрывать не? |
|
DiRTy_GaRRy, реализовывать свою идею с корзиной будешь? Если нет - закрываем. |
|
DrKnS, я уже и забыл. :) Посмотрю на неделе текущее состояние и если что -- сделаю. |
|
В принципе, сделать не проблема... правда по хожу дела у меня возник вопрос: нужно или нет делть запрос на такое прямое удаление? P.S. Плюс до кучи будет следующее: 1. Запрос с кнопками Retry, Skip итд не только для файлов, но и для папок (как то оно странно было написано); 2. Единый обработчик скипов для файлов и папок. |
Date Modified | Username | Field | Change |
---|---|---|---|
2006-11-02 01:28 | DiRTy_GaRRy | New Issue | |
2006-11-02 03:26 | Zuz | Note Added: 0000306 | |
2006-11-02 03:41 | DiRTy_GaRRy | Note Added: 0000307 | |
2006-11-07 12:15 | cos | Note Added: 0000310 | |
2006-11-07 21:31 | DiRTy_GaRRy | Note Added: 0000311 | |
2007-11-18 00:39 | Oleg Bekhter | Note Added: 0000771 | |
2007-11-18 01:08 | Oleg Bekhter | Note Edited: 0000771 | |
2007-11-20 15:28 | Oleg Bekhter | File Added: copy.cpp.diff.7z | |
2007-11-20 15:29 | Oleg Bekhter | File Added: cvtname.cpp.diff.7z | |
2007-11-20 15:30 | Oleg Bekhter | File Added: delete.cpp.diff.7z | |
2007-11-20 15:30 | Oleg Bekhter | File Added: dizlist.cpp.diff.7z | |
2007-11-20 15:30 | Oleg Bekhter | File Added: editor.cpp.diff.7z | |
2007-11-20 15:30 | Oleg Bekhter | File Added: execute.cpp.diff.7z | |
2007-11-20 15:30 | Oleg Bekhter | File Added: farwinapi.cpp.diff.7z | |
2007-11-20 15:31 | Oleg Bekhter | File Added: ffolders.cpp.diff.7z | |
2007-11-20 15:31 | Oleg Bekhter | File Added: fileattr.cpp.diff.7z | |
2007-11-20 15:31 | Oleg Bekhter | File Added: fileedit.cpp.diff.7z | |
2007-11-20 15:31 | Oleg Bekhter | File Added: filelist.cpp.diff.7z | |
2007-11-20 15:32 | Oleg Bekhter | File Added: flink.cpp.diff.7z | |
2007-11-20 15:32 | Oleg Bekhter | File Added: flplugin.cpp.diff.7z | |
2007-11-20 15:32 | Oleg Bekhter | File Added: flupdate.cpp.diff.7z | |
2007-11-20 15:32 | Oleg Bekhter | File Added: fn.hpp.diff.7z | |
2007-11-20 15:32 | Oleg Bekhter | File Added: foldtree.cpp.diff.7z | |
2007-11-20 15:33 | Oleg Bekhter | File Added: history.cpp.diff.7z | |
2007-11-20 15:33 | Oleg Bekhter | File Added: infolist.cpp.diff.7z | |
2007-11-20 15:33 | Oleg Bekhter | File Added: macro.cpp.diff.7z | |
2007-11-20 15:33 | Oleg Bekhter | File Added: main.cpp.diff.7z | |
2007-11-20 15:33 | Oleg Bekhter | File Added: manager.cpp.diff.7z | |
2007-11-20 15:34 | Oleg Bekhter | File Added: mix.cpp.diff.7z | |
2007-11-20 15:34 | Oleg Bekhter | File Added: mkdir.cpp.diff.7z | |
2007-11-20 15:34 | Oleg Bekhter | File Added: panel.cpp.diff.7z | |
2007-11-20 15:34 | Oleg Bekhter | File Added: plognmn.cpp.diff.7z | |
2007-11-20 15:38 | Oleg Bekhter | File Added: PluginA.cpp.diff.7z | |
2007-11-20 15:38 | Oleg Bekhter | File Added: Plugins.cpp.diff.7z | |
2007-11-20 15:38 | Oleg Bekhter | File Added: PluginW.cpp.diff.7z | |
2007-11-20 15:38 | Oleg Bekhter | File Added: print.cpp.diff.7z | |
2007-11-20 15:39 | Oleg Bekhter | File Added: qview.cpp.diff.7z | |
2007-11-20 15:39 | Oleg Bekhter | File Added: setattr.cpp.diff.7z | |
2007-11-20 15:39 | Oleg Bekhter | File Added: syslog.cpp.diff.7z | |
2007-11-20 15:39 | Oleg Bekhter | File Added: treelist.cpp.diff.7z | |
2007-11-20 15:40 | Oleg Bekhter | File Added: usermenu.cpp.diff.7z | |
2007-11-20 15:40 | Oleg Bekhter | File Added: viewer.cpp.diff.7z | |
2007-11-20 15:41 | Oleg Bekhter | File Added: filepanels.cpp.diff.7z | |
2007-11-20 15:42 | Oleg Bekhter | File Added: findfile.cpp.diff.7z | |
2007-11-20 15:45 | Oleg Bekhter | File Added: Far.exe.7z | |
2007-11-20 15:46 | Oleg Bekhter | Note Added: 0000780 | |
2007-11-20 16:58 | alexy | Note Added: 0000781 | |
2007-11-20 17:04 | Oleg Bekhter | Note Added: 0000782 | |
2007-11-23 06:56 | alexy | Note Added: 0000801 | |
2007-11-23 07:09 | Oleg Bekhter | File Added: 246.7z | |
2007-11-23 07:10 | Oleg Bekhter | Note Added: 0000802 | |
2007-11-23 07:56 | alexy | Note Added: 0000807 | |
2007-11-23 07:57 | DrKnS | Note Added: 0000808 | |
2007-11-23 08:08 | Oleg Bekhter | Note Added: 0000810 | |
2007-11-25 01:40 | Oleg Bekhter | Note Added: 0000846 | |
2007-11-25 01:48 | alexy | Note Added: 0000847 | |
2007-11-25 01:48 | alexy | File Deleted: copy.cpp.diff.7z | |
2007-11-25 01:48 | alexy | File Deleted: cvtname.cpp.diff.7z | |
2007-11-25 01:49 | alexy | File Deleted: delete.cpp.diff.7z | |
2007-11-25 01:49 | alexy | File Deleted: dizlist.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: editor.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: execute.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: farwinapi.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: ffolders.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: fileattr.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: fileedit.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: filelist.cpp.diff.7z | |
2007-11-25 01:50 | alexy | File Deleted: flink.cpp.diff.7z | |
2007-11-25 01:50 | Oleg Bekhter | Note Added: 0000848 | |
2007-11-25 01:52 | alexy | File Deleted: flplugin.cpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: flupdate.cpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: fn.hpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: foldtree.cpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: history.cpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: infolist.cpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: macro.cpp.diff.7z | |
2007-11-25 01:59 | alexy | File Deleted: main.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: manager.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: mix.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: mkdir.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: panel.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: plognmn.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: PluginA.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: Plugins.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: PluginW.cpp.diff.7z | |
2007-11-25 02:00 | alexy | File Deleted: print.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: qview.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: setattr.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: syslog.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: treelist.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: usermenu.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: viewer.cpp.diff.7z | |
2007-11-25 02:01 | alexy | File Deleted: filepanels.cpp.diff.7z | |
2007-11-25 02:02 | alexy | File Deleted: findfile.cpp.diff.7z | |
2007-11-25 02:02 | alexy | File Deleted: Far.exe.7z | |
2007-11-26 02:57 | vskirdin | Note Added: 0000853 | |
2007-11-26 03:12 | alexy | Note Added: 0000857 | |
2007-11-26 03:12 | alexy | Status | new => assigned |
2007-11-26 03:12 | alexy | Assigned To | => alexy |
2007-12-01 04:31 | Oleg Bekhter | Note Added: 0000888 | |
2007-12-01 04:32 | Oleg Bekhter | File Added: 246-new.7z | |
2007-12-01 04:34 | Oleg Bekhter | Note Added: 0000889 | |
2007-12-01 06:36 | alexy | Note Added: 0000890 | |
2007-12-02 02:24 | Oleg Bekhter | Note Added: 0000908 | |
2007-12-02 02:34 | alexy | Note Added: 0000909 | |
2008-11-20 13:46 | alexy | Assigned To | alexy => |
2008-11-20 13:46 | alexy | Status | assigned => new |
2009-02-11 13:16 | samlyukov | Note Added: 0002414 | |
2009-02-11 14:30 | DiRTy_GaRRy | Note Added: 0002424 | |
2009-02-11 14:43 | DiRTy_GaRRy | File Added: SHFileOperation.patch | |
2009-02-11 14:44 | DiRTy_GaRRy | Note Added: 0002426 | |
2009-02-11 15:34 | DrKnS | Note Added: 0002428 | |
2009-02-11 15:39 | DiRTy_GaRRy | Note Added: 0002429 | |
2009-02-11 15:40 | DiRTy_GaRRy | Note Edited: 0002429 | |
2009-02-11 15:58 | DrKnS | Note Added: 0002430 | |
2009-02-11 17:39 | DiRTy_GaRRy | Note Added: 0002433 | |
2009-02-12 08:16 | DiRTy_GaRRy | Note Added: 0002436 | |
2009-02-12 08:18 | DiRTy_GaRRy | Note Edited: 0002436 | |
2009-02-12 15:42 | DrKnS | Note Added: 0002442 | |
2009-02-12 15:57 | DiRTy_GaRRy | Note Added: 0002445 | |
2009-02-12 16:05 | DiRTy_GaRRy | Note Added: 0002446 | |
2009-04-05 12:46 | alexy | Note Added: 0002890 | |
2009-04-05 12:46 | alexy | Assigned To | => DrKnS |
2009-04-05 12:46 | alexy | Status | new => assigned |
2009-09-25 07:50 | DrKnS | Note Added: 0004114 | |
2009-09-25 08:02 | DiRTy_GaRRy | Note Added: 0004115 | |
2009-09-25 08:27 | DrKnS | Assigned To | DrKnS => DiRTy_GaRRy |
2009-09-27 22:14 | DiRTy_GaRRy | Note Added: 0004136 | |
2010-05-02 20:44 | alexy | Project | Far Manager 1.7x => Far Manager |
2010-05-02 20:45 | alexy | Category | File System => Delete files/folders |
2010-05-02 20:45 | alexy | Product Version | 1.71 => |
2010-05-02 20:45 | alexy | Build | => 0 |
2010-05-02 20:45 | alexy | Status | assigned => closed |
2010-05-02 20:45 | alexy | Resolution | open => fixed |
2010-05-02 20:45 | alexy | Fixed in Version | => 2.0 |