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 12: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 12:06 | alexy | Status | resolved => closed |
| 2013-05-20 20:30 | alexy | Category | FTP => FTP (old) |