View Issue Details

IDProjectCategoryView StatusLast Update
0000247PluginsFTP (old)public2007-07-16 13:06
ReporterDiRTy_GaRRy Assigned Toalexy  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Platformx86OSWindows 
Product Version1.71 
Fixed in Version1.71 
Summary0000247: Плагин иногда не может копировать директории с содержимым на UNC пути
DescriptionПлагин не может копировать директории с ftp, когда в качестве оконечной директории указан сетевой путь. Т.е. копировать, то он пытается, но вместо того что бы создать папку в нужном месте он создаёт её в текущей локальной папке, а при копировании содержащихся в папке файлов выдаёт ошибку о невозможности открытия или создания файла. Самое интересное, что иногда он копирует всё нормально, причём, закономерность я так и не смог выявить.
Additional InformationВерсия плагина 1.7.0.0 build 28.10.2005
Прилагаю мультик и лог ftp.
TagsNo tags attached.

Activities

DiRTy_GaRRy

2007-01-17 10:49

developer   bugnote:0000388

В файле 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{

Вроде работает. Замерджите, пожалуйста.

DiRTy_GaRRy

2007-01-17 13:02

developer   bugnote:0000389

Last edited: 2007-01-17 13:05

Не... лажа... ещё поправить надо :) Завтра доделаю.

alexy

2007-01-18 01:27

administrator   bugnote:0000391

Чёт я не в том порядке прочитал и уже закомитил. Но не страшно. Тока не совсем понимаю в чём баг, логи т.п. ты не приаттачил.

DiRTy_GaRRy

2007-01-18 03:03

developer   bugnote:0000392

Ошибка в том, что эта функция отрезала для сетевых путей часть \\server\share\ и потом пыталась из оставшегося хвоста создавать папки, которые, соотвественно, вместо сетевого пути создавались в текущей папке процесса FAR-а, что влекло за собой сбой прик копировании папок. Вообще эта функция кривая. Тот вариант, что я запостил будет работать только с нормальными путями, \\?\ - локальными путями и UNC путями вида \\server\share\. Она не будет работать (и не работала раньше) с полными UNC-путями \\?\UNC\Server\Share и с volume names вида \\?\Volume{GUID}\. Поддержку полных UNC-путей надо бы доделать, а вот c volume names хз, если не влом будет, то доделаю, ведь на c++ я уже не писал лет так 8. ;-)

P.S. А код у плагина мясной...

DiRTy_GaRRy

2007-01-18 09:08

developer   bugnote:0000393

Last edited: 2007-01-18 09:09

Тэкс... вроде работает со всем. Сделал следующее:
- поддержку всяких там виндовых путей \\?\ \\?\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;
}
ftp_Mix_DoCreateDirectory.cpp (2,565 bytes)   

DiRTy_GaRRy

2007-01-18 10:53

developer   bugnote:0000394

Last edited: 2007-01-18 10:54

Поддержку путей вида \\.\ не делал, так как не совсем понял чем они отличаются от \\?\ (чё-то меня MSDN в этой части напугал ;-) ) и к чему это может привести... Надо подумать...

И вообще... что то я разизвращался...

alexy

2007-01-18 18:21

administrator   bugnote:0000395

Так, немного подправил (убрал провеку на существование так как не будет работать в win9x плюс будет глюк если есть такой файл а не папка ну и добавил ещё две мелкие проверки). Закомитил. Проверь пожалуйста что всё ОК и отпишись тут.

alexy

2007-02-04 12:26

administrator   bugnote:0000402

Ало? Можно закрывать?

DiRTy_GaRRy

2007-02-04 23:30

developer   bugnote:0000404

Сорри. Отвлёкся. Да.

Issue History

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)