View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000247 | Plugins | FTP (old) | public | 2006-11-02 01:52 | 2007-07-16 13:06 |
Reporter | DiRTy_GaRRy | Assigned To | alexy | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | x86 | OS | Windows | OS Version | XP SP2 |
Product Version | 1.71 | ||||
Fixed in Version | 1.71 | ||||
Summary | 0000247: Плагин иногда не может копировать директории с содержимым на UNC пути | ||||
Description | Плагин не может копировать директории с ftp, когда в качестве оконечной директории указан сетевой путь. Т.е. копировать, то он пытается, но вместо того что бы создать папку в нужном месте он создаёт её в текущей локальной папке, а при копировании содержащихся в папке файлов выдаёт ошибку о невозможности открытия или создания файла. Самое интересное, что иногда он копирует всё нормально, причём, закономерность я так и не смог выявить. | ||||
Additional Information | Версия плагина 1.7.0.0 build 28.10.2005 Прилагаю мультик и лог ftp. | ||||
Tags | No tags attached. | ||||
|
В файле ftp_Mix.cpp следует заменить начало функции DoCreateDirectory на следующее: BOOL DECLSPEC DoCreateDirectory( char *nm ) { char *m; char ch; UINT tp; int b = 0; //Skip UNC abs path if ( StrCmp( nm, "\\\\?\\",4 ) == 0 ) b = 4; //Skip UNC share name if ( nm[0] == SLASH_CHAR && nm[1] == SLASH_CHAR ) { b = StrPosChr( nm, SLASH_CHAR, b + 2 ); if ( b == -1 ) { Log(( "UNC does not contains resource name" )); return FALSE; } b = StrPosChr( nm, SLASH_CHAR, b + 1 ); if ( b == -1 ) return TRUE; b += 1; } //Normal m = nm + b; do{ Вроде работает. Замерджите, пожалуйста. |
|
Не... лажа... ещё поправить надо :) Завтра доделаю. |
|
Чёт я не в том порядке прочитал и уже закомитил. Но не страшно. Тока не совсем понимаю в чём баг, логи т.п. ты не приаттачил. |
|
Ошибка в том, что эта функция отрезала для сетевых путей часть \\server\share\ и потом пыталась из оставшегося хвоста создавать папки, которые, соотвественно, вместо сетевого пути создавались в текущей папке процесса FAR-а, что влекло за собой сбой прик копировании папок. Вообще эта функция кривая. Тот вариант, что я запостил будет работать только с нормальными путями, \\?\ - локальными путями и UNC путями вида \\server\share\. Она не будет работать (и не работала раньше) с полными UNC-путями \\?\UNC\Server\Share и с volume names вида \\?\Volume{GUID}\. Поддержку полных UNC-путей надо бы доделать, а вот c volume names хз, если не влом будет, то доделаю, ведь на c++ я уже не писал лет так 8. ;-) P.S. А код у плагина мясной... |
|
Тэкс... вроде работает со всем. Сделал следующее: - поддержку всяких там виндовых путей \\?\ \\?\UNC\ \\?\Volume\{Guid}\ - поддержку относительных путей с:\temp\1\..\ итд - сделал проверку на существование директории перед её созданием ... вроде работает ... сильно не пинайте P.S. приложил ftp_Mix_DoCreateDirectory.cpp. В нём только одна функция DoCreateDirectory. Её нужно заменить в ftp_Mix.cpp |
2007-01-18 09:08
|
ftp_Mix_DoCreateDirectory.cpp (2,565 bytes)
BOOL DECLSPEC DoCreateDirectory(char *directoryPath) { PROC(("DoCreateDirectory","[%s]", directoryPath)); // Check directory if (!directoryPath) { Log(("Directory path is empty")); return true; } // Check directory existanse HANDLE hDirectory = CreateFile( directoryPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if (hDirectory != INVALID_HANDLE_VALUE) { CloseHandle(hDirectory); Log(("Directory already exist")); return true; } // Get full directory path char directoryPathFull[MAX_PATH], *lpFilePart; if (!GetFullPathName(directoryPath, MAX_PATH, directoryPathFull, &lpFilePart)) { Log(("GetFullPathName error: %d", GetLastError())); return true; } // UNC network path flag bool isUncPath = false; // Folders only path char *directoriesPath = directoryPathFull; // Build folders only path if (StrCmp(directoriesPath, "\\\\", 2) == 0) { directoriesPath += 2; if (StrCmp(directoriesPath, "?\\", 2) == 0) { directoriesPath += 2; if (StrCmp(directoriesPath, "UNC\\", 4) == 0) { directoriesPath += 4; isUncPath = true; } else if (StrCmp(directoriesPath, "Volume{", 7) == 0) { directoriesPath += 7; directoriesPath = StrChr(++directoriesPath, '}'); if (!directoriesPath) { Log(("Volume name is not valid")); return false; } directoriesPath++; } else if (StrCmp(++directoriesPath, ":\\", 2) == 0) { directoriesPath += 2; } } else { isUncPath = true; } } if (isUncPath) { directoriesPath = StrChr(directoriesPath, SLASH_CHAR); if (!directoriesPath) { Log(("UNC path does not contains resource name")); return FALSE; } directoriesPath = StrChr(++directoriesPath, SLASH_CHAR); if (!directoriesPath) { return true; } directoriesPath++; } // Step by step create all directoriesPath structure (maybe SHCreateDirectoryEx?) char ch; do { directoriesPath = StrChr(++directoriesPath, SLASH_CHAR); if (directoriesPath) { ch = *directoriesPath; *directoriesPath = 0; } Log(("CreateDirectory: [%s]", directoryPathFull)); if (!CreateDirectory(directoryPathFull, NULL)) { if (GetLastError() != ERROR_ALREADY_EXISTS) { Log(("CreateDirectory error: %d", GetLastError())); return false; } } if (directoriesPath) { *directoriesPath = ch; } } while(directoriesPath); return true; } |
|
Поддержку путей вида \\.\ не делал, так как не совсем понял чем они отличаются от \\?\ (чё-то меня MSDN в этой части напугал ;-) ) и к чему это может привести... Надо подумать... И вообще... что то я разизвращался... |
|
Так, немного подправил (убрал провеку на существование так как не будет работать в win9x плюс будет глюк если есть такой файл а не папка ну и добавил ещё две мелкие проверки). Закомитил. Проверь пожалуйста что всё ОК и отпишись тут. |
|
Ало? Можно закрывать? |
|
Сорри. Отвлёкся. Да. |
Date Modified | Username | Field | Change |
---|---|---|---|
2006-11-02 01:52 | DiRTy_GaRRy | New Issue | |
2007-01-17 10:49 | DiRTy_GaRRy | Note Added: 0000388 | |
2007-01-17 13:02 | DiRTy_GaRRy | Note Added: 0000389 | |
2007-01-17 13:05 | DiRTy_GaRRy | Note Edited: 0000389 | |
2007-01-18 01:27 | alexy | Note Added: 0000391 | |
2007-01-18 01:27 | alexy | Status | new => assigned |
2007-01-18 01:27 | alexy | Assigned To | => alexy |
2007-01-18 03:03 | DiRTy_GaRRy | Note Added: 0000392 | |
2007-01-18 09:08 | DiRTy_GaRRy | Note Added: 0000393 | |
2007-01-18 09:08 | DiRTy_GaRRy | File Added: ftp_Mix_DoCreateDirectory.cpp | |
2007-01-18 09:09 | DiRTy_GaRRy | Note Edited: 0000393 | |
2007-01-18 10:53 | DiRTy_GaRRy | Note Added: 0000394 | |
2007-01-18 10:54 | DiRTy_GaRRy | Note Edited: 0000394 | |
2007-01-18 18:21 | alexy | Note Added: 0000395 | |
2007-02-04 12:26 | alexy | Note Added: 0000402 | |
2007-02-04 23:30 | DiRTy_GaRRy | Note Added: 0000404 | |
2007-02-05 02:00 | alexy | Status | assigned => resolved |
2007-02-05 02:00 | alexy | Resolution | open => fixed |
2007-02-05 02:00 | alexy | Fixed in Version | => 1.71 |
2007-07-16 13:06 | alexy | Status | resolved => closed |
2013-05-20 21:30 | alexy | Category | FTP => FTP (old) |