View Issue Details

IDProjectCategoryView StatusLast Update
0000246Far ManagerDelete files/folderspublic2010-05-02 20:45
ReporterDiRTy_GaRRy Assigned ToDiRTy_GaRRy  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Platformx86OSWindowsOS VersionXP SP2
Fixed in Version2.0 
Summary0000246: Нет возможности работать с папками оканчивающимися на пробел
DescriptionFAR не может производить никаких операций с папками оканчивающимися на пробелы (NTFS). Т.е. в такую папку нельзя зайти, её нельзя удалить или переименовать. Хотелось бы что бы с такими папками можно было делать стандартные операции, как то удаление/копироване/переименование/заход.
Steps To Reproduce1. Запускаем FAR;
2. Создаём папку при помощи команды md "Folder \";
3. Пытаемся что-либо сделать с такой папкой и у нас это не получается.
TagsNo tags attached.
Build0

Activities

Zuz

2006-11-02 03:26

developer   bugnote:0000306

Удалить можно.

DiRTy_GaRRy

2006-11-02 03:41

developer   bugnote:0000307

Zuz, да, действительно, по Shift+Del удаллить можно, а при удалении в корзину FAR даже ошибки не выдаёт (впрочем, может это ограничения shell-х функций).

cos

2006-11-07 12:15

developer   bugnote:0000310

Как создать такую папку? Через md "1 " не получилось.

DiRTy_GaRRy

2006-11-07 21:31

developer   bugnote:0000311

cos, я же в "Steps To Reproduce " написал как. :)

P.S. md "1 \"

Oleg Bekhter

2007-11-18 00:39

reporter   bugnote:0000771

Last edited: 2007-11-18 01:08

Это известная баго-фича 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...

Oleg Bekhter

2007-11-20 15:46

reporter   bugnote:0000780

Fix подготовил... То что я нашел - это нельзя создать каталог с пробелом в конце.
Ну и желательно протестировать - вариантов много....

alexy

2007-11-20 16:58

administrator   bugnote:0000781

А положить все файлы в один архив ни как незя было?

Oleg Bekhter

2007-11-20 17:04

reporter   bugnote:0000782

Пардон, это прога отработала. Я же лентяй -:) Пришлось на nncron скриптик нарисовать - сейчас исправлю.

alexy

2007-11-23 06:56

administrator   bugnote:0000801

Я всё жду всех файлов (exe не надо) в одном архиве.

2007-11-23 07:09

 

246.7z (18,980 bytes)

Oleg Bekhter

2007-11-23 07:10

reporter   bugnote:0000802

Загрузил - 246.7z
У меня нет прав на удаление файлов...

alexy

2007-11-23 07:56

administrator   bugnote:0000807

У патча есть несколько мелких проблем со стилем:
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);

Прошу исправить всё под общий стиль как я описал. Жду.

DrKnS

2007-11-23 07:57

administrator   bugnote:0000808

Если в конце не один пробел, а два и больше, зайти по-прежнему нельзя.

Oleg Bekhter

2007-11-23 08:08

reporter   bugnote:0000810

За выходные исправлю...
А вот с двумя пробелами интересно -(: Хоть я и сам работник Microsoft, но КАК я "ЛЮБЛЮ" WinAPI!!!!!!!!

Oleg Bekhter

2007-11-25 01:40

reporter   bugnote:0000846

Как будет время, поулаляй, pls, лишние файлы. Чтобы перед глазами не мелькали...

alexy

2007-11-25 01:48

administrator   bugnote:0000847

Ты тут нафигачил их а мне удалять :)

Oleg Bekhter

2007-11-25 01:50

reporter   bugnote:0000848

Дык, у меня прав на удаление нет -(:

vskirdin

2007-11-26 02:57

administrator   bugnote:0000853

Oleg Bekhter: как дела? То, что здесь приаттачено - работоспособно?

alexy

2007-11-26 03:12

administrator   bugnote:0000857

Оно работоспособно но не совсем вписывается в наш код. Он скоро выложит новый патч.

Oleg Bekhter

2007-12-01 04:31

reporter   bugnote:0000888

Извиняюсь за задержку - конец месяца. Авралы в конце месяца, оказывается, не только в СовДепии бывают -:)

2007-12-01 04:32

 

246-new.7z (20,971 bytes)

Oleg Bekhter

2007-12-01 04:34

reporter   bugnote:0000889

Кстати, работу с folders с двумя и больше пробелами на конце исправил...

alexy

2007-12-01 06:36

administrator   bugnote:0000890

Ты вообще читал то что я тебе писал вверху? Ты исправил тока префикс api, всё остальное осталось и даже стало хуже.

Oleg Bekhter

2007-12-02 02:24

reporter   bugnote:0000908

А что все остальное. Все логику я перевел в farwinapi.cpp. Prefix переменных исправил там, где я использую строки использую, как указано.
Вся работа со строками реализована на string (UnicodeString)
Сравнение использую через внутренние функции. И т.д.
Что не правильно?

alexy

2007-12-02 02:34

administrator   bugnote:0000909

Пункты 2 и 4 сверху. С префиксами ты там вообще намутил, придумал какой то префикс wsz для string вместо того чтоб юзать префикс str.
Ну и доп. не нравится мне твой FileNameConvert но это уже мелочь, сам переделаю когда доделаешь всё остальное.

samlyukov

2009-02-11 13:16

reporter   bugnote:0002414

это вроде исправили, не?

DiRTy_GaRRy

2009-02-11 14:30

developer   bugnote:0002424

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
 
SHFileOperation.patch (622 bytes)   

DiRTy_GaRRy

2009-02-11 14:44

developer   bugnote:0002426

В общем, к 1. патч прикрепил.

DrKnS

2009-02-11 15:34

administrator   bugnote:0002428

> 1. Удаление в корзину директорий с пробелами в конце как и раньше молча не работает (забыли добавить \0\0 во вторую попытку. Могу дать патч);


Хм, а у тебя что, эта "вторая попытка" работает?

У меня SHFileOperationW с префиксным путем возвращает 0x7с, что, согласно Писанию, следует понимать как "The path in the source or destination or both was invalid."

DiRTy_GaRRy

2009-02-11 15:39

developer   bugnote:0002429

Last edited: 2009-02-11 15:40

DrKnS, с моим патчем — работает.

P.S. Windows Server 2003 R2 SP2.

DrKnS

2009-02-11 15:58

administrator   bugnote:0002430

> P.S. Windows Server 2003 R2 SP2.

Ясно, значит это висту погнули.

DiRTy_GaRRy

2009-02-11 17:39

developer   bugnote:0002433

DrKnS, надо будет посмотреть.

DiRTy_GaRRy

2009-02-12 08:16

developer   bugnote:0002436

Last edited: 2009-02-12 08:18

Спасибо. Сделали. Почитал TODO. Может, действительно, не париться и использовать при ошибке apiDeleteFile. А по поводу IFileOperation под Vista… Что то мне подсказывает, что оно как и старые shell-е функции не будет работать с такими папками/файлами.

Кстати, может стоит проверять наличие в конце пути пробела? А то мы можем нарваться на то, что файл/папка не удалились по какой-либо другой причине, а потом эта причина пропала, а мы из-за этого грохаем файл перманентно. Могу сделать патчик. ;)

P.S. Кстати, в последнем патче имеется мешанина из табов и пробелов.

DrKnS

2009-02-12 15:42

administrator   bugnote:0002442

Я вот тоже думаю, что если не смогли удалить в корзину, то надо делать apiDeleteFile, возможно, с дополнительным подтверждением типа "в корзину ниасилил, удалить насовсем? Да/Нет"

Про "не удалились по какой-либо другой причине, а потом эта причина пропала" - не совсем понял, что имелось в виду, давай примеры.

А мешанина из пробелов и табов- это "нормально".
Сейчас ориентация на табы, но, дабы не повышать энтропию Вселенной, замена производится не глобально, а постепенно :)

DiRTy_GaRRy

2009-02-12 15:57

developer   bugnote:0002445

DrKnS, по поводу пропадаения причины. Допустим, мы пытаемся удалить папку, но обламываемся из-за нарушения совместного доступа. Так удаление при этом проходит не мгновенно (система какое-то время думает, а потом только выдаёт ошибку), то мы можем за это время, например, выйти из папки и конфликт разрешиться. Соответсвенно, после окончания задумчивости мы переходим ко второму условию и успешно удаляем папку минуя корзину.

Возможно два выхода из данной ситуации:
1. Делать вторую попытку через обычное удаление только для папок оканчивающихся на пробел, так как такие папки всё рано обычными средствами пока не удалить.
2. Анализировать код возврата и делать вторую попытку через обычное удаление только для 0x402 (pre Vista системы) и для 0x7C (Vista и выше системы).

После некоторых размышлений я склоняюсь ко второму варианту, так как он более корректен.

DiRTy_GaRRy

2009-02-12 16:05

developer   bugnote:0002446

Кстати, вторую попытку так же можно делать для кодов ошибок связанных с MAX_PATH (судя по мсдн это 0x79, 0x81 и 0xB7), тогда минуя корзину будет удаляться всё за MAX_PATH.

alexy

2009-04-05 12:46

administrator   bugnote:0002890

Это уже вроде можно закрывать не?

DrKnS

2009-09-25 07:50

administrator   bugnote:0004114

DiRTy_GaRRy, реализовывать свою идею с корзиной будешь?

Если нет - закрываем.

DiRTy_GaRRy

2009-09-25 08:02

developer   bugnote:0004115

DrKnS, я уже и забыл. :) Посмотрю на неделе текущее состояние и если что -- сделаю.

DiRTy_GaRRy

2009-09-27 22:14

developer   bugnote:0004136

В принципе, сделать не проблема... правда по хожу дела у меня возник вопрос: нужно или нет делть запрос на такое прямое удаление?

P.S. Плюс до кучи будет следующее:
1. Запрос с кнопками Retry, Skip итд не только для файлов, но и для папок (как то оно странно было написано);
2. Единый обработчик скипов для файлов и папок.

Issue History

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