C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: GetShortPathNameW - пустая строка  (Прочитано 3313 раз)
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


GetShortPathNameW - пустая строка
« : 07 Май 2012, 07:42:48 »

Подскажите, пожалуйста, почему функция возвращает пустую строку?
Использую код:
Код
bool __fastcall TODF_ThreadPro::CopyOneFile (String Src, String Dest, int Option_Copy)
{
try
{
if (Option_Copy == 1) Src += "_копия";
if (!CopyFileExW(Src.w_str(), Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy))  //COPY_FILE_FAIL_IF_EXISTS
{
//Преобразование длинных имен файлов в короткие
String S_Src, S_Dest;
GetShortPathNameW(Src.w_str(), S_Src.w_str(), 32767);
GetShortPathNameW(Dest.w_str(), S_Dest.w_str(), 32767);
if (!CopyFileExW(S_Src.w_str(), S_Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy))  //COPY_FILE_FAIL_IF_EXISTS
{
String Error_String = SysErrorMessage (GetLastError());
VOID SetLastError (IN DWORD dwErrCode);
Application->NormalizeTopMosts();
#ifdef _DELPHI_STRING_UNICODE
Application->MessageBox((Error_String + " + Src + ">").w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST);
#else
Application->MessageBox((Error_String + " + Src + ">").w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST);
#endif
Application->RestoreTopMosts();
return false;
}
}
return true;
}
catch(...)
{
return false;
}
}
« Последнее редактирование: 09 Май 2012, 20:19:40 от volvo877 » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: GetShortPathNameW - пустая строка
« Ответ #1 : 07 Май 2012, 10:21:43 »

Во-первых, плохо читаешь MSDN. Там явно сказано (GetShortPathName function):
Цитировать
In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path.
Ты этого не сделал.

Во вторых: w_str() возвращает константный указатель на данные, а тебе нужен неконстантный:
Код
DWORD WINAPI GetShortPathName(
 __in   LPCTSTR lpszLongPath,
 __out  LPTSTR lpszShortPath, //
 __in   DWORD cchBuffer
);
, проще выделить статический буфер.

Ну, и третье, самое главное: ты хочешь взять то, чего нет: файл никуда не скопирован, у тебя есть только тот путь, который содержался в старом значении Src, то есть, до добавления _T("_копия"), а ты хочешь взять имена файлов, которые не существуют. Это невозможно
Записан
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


Re: GetShortPathNameW - пустая строка
« Ответ #2 : 08 Май 2012, 07:42:50 »

Я пробую так,
Код:
SS_Src = "\\\\?\\";
SS_Src += Src;
Src = SS_Src;
GetShortPathName(Src.t_str(), S_Src.t_str(), 32767);
Все равно, функция возвращает нулевое значение. В S_Src ничего нет.
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: GetShortPathNameW - пустая строка
« Ответ #3 : 08 Май 2012, 10:09:57 »

Метод _str() возвращает массив для чтения неизвестной длины, запись в него не гарантируется и не правильна.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: GetShortPathNameW - пустая строка
« Ответ #4 : 08 Май 2012, 10:14:00 »

Makin_tosh, вторая часть моего сообщения еще не прочитана? Файл с тем именем, от которого ты пытаешься получить ShortName, на диске есть? Нет. Вот и имени нет.
Записан
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


Re: GetShortPathNameW - пустая строка
« Ответ #5 : 08 Май 2012, 12:12:37 »

Ну вообщем копирует вроде:
Код
       try
{
if (Option_Copy == 1) Src += "_копия";
String S_Src, SS_Src, S_Dest, SS_Dest;
SS_Src = "\\\\?\\";
SS_Src += Src;
Src = SS_Src;
SS_Dest = "\\\\?\\";
SS_Dest += Dest;
Dest = SS_Dest;
if (!CopyFileExW(Src.w_str(), Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy))
{
int length = GetShortPathNameW(Src.w_str(), NULL, 0);
if (length != 0)
{
wchar_t *buffer = new wchar_t[length];
length = GetShortPathNameW(Src.w_str(), (wchar_t *)buffer, length);
if (length != 0)
{
S_Src = (String)buffer;
if (!CopyFileExW(S_Src.w_str(), Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy))  //COPY_FILE_FAIL_IF_EXISTS
{
String Error_String = SysErrorMessage (GetLastError());
Error_String += ". Возникло при обработке файла: " + S_Src;
VOID SetLastError (IN DWORD dwErrCode);
Application->NormalizeTopMosts();
#ifdef _DELPHI_STRING_UNICODE
Application->MessageBox(Error_String.w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST);
#else
Application->MessageBox(Error_String.w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST);
#endif
Application->RestoreTopMosts();
return false;
}
}
}
}
return true;
}
catch(...)
{
return false;
}
Цитировать
w_str() возвращает константный указатель на данные, а тебе нужен неконстантный:
Я так понял что метод GetShortPathNameW именно это и просит.
Одно не понятно пока, если GetShortPathName можно использовать только с существующим файлом, как же тогда поступить, если целевой путь слишком большой?
« Последнее редактирование: 09 Май 2012, 20:20:00 от volvo877 » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: GetShortPathNameW - пустая строка
« Ответ #6 : 08 Май 2012, 12:27:29 »

Цитировать
как же тогда поступить, если целевой путь слишком большой?
Длиннее 32К? В топку такие пути. До 32К (при учете добавления "\\?\" к имени файла) CopyFileEx должен разруливать ситуацию самостоятельно, безо всяких ShortPath-ов...
Записан
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


Re: GetShortPathNameW - пустая строка
« Ответ #7 : 08 Май 2012, 12:43:23 »

Вот сейчас пробую копировать файл:
e:\Документация семьи\Литература (справочная информация)\Обучающий материал Delphi и C++\Обучающий материал C++\Ini\(Общие вопросы) Как создать ini файл в том каталоге где и программа  - C++Builder FAQ - devoid_com_ua - Портал программистов files\add_question.gif
в:
e:\Документация семьи\Литература (справочная информация)\Обучающий материал Delphi и C++\Обучающий материал C++\"____"\Ini\(Общие вопросы) Как создать ini файл в том каталоге где и программа  - C++Builder FAQ - devoid_com_ua - Портал программистов files\add_question.gif
возникает ошибка: Системе не удается найти указанный путь. Путь чего (исходного или целевого файла)?
Записан
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


Re: GetShortPathNameW - пустая строка
« Ответ #8 : 08 Май 2012, 12:46:43 »

Всего-то целевой файл 277 символов.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: GetShortPathNameW - пустая строка
« Ответ #9 : 08 Май 2012, 13:36:18 »

Цитировать
возникает ошибка: Системе не удается найти указанный путь. Путь чего (исходного или целевого файла)?
Ну неправда же:
Записан
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


Re: GetShortPathNameW - пустая строка
« Ответ #10 : 09 Май 2012, 05:44:27 »

Ваша правда, проблема была в создании каталога с длинным именем. Сейчас сделал так, и усе стало работать.
Код:
if (!DirectoryExists(Dest_ + "\\" + Sr.Name))
{
NewDir = String("\\\\?\\") + Dest_ + "\\" + Sr.Name;
CreateDirectoryW(NewDir.w_str(), NULL);
}
Еще один вопрос, как у Вас в строке
Код:
if (!CopyFileExW(Copy_Src.t_str(), Copy_Dest.t_str(), CopyProgressRoutine, NULL, NULL, Option_Copy))  /////// t_str() компилируется?
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: GetShortPathNameW - пустая строка
« Ответ #11 : 09 Май 2012, 08:33:12 »

А чего бы ему не компилироваться, если у меня в Project->Options->Directories and Conditionals выставлено, что _TCHAR maps to wchar_t, т.е., проект Юникодный, а не ANSI?
Записан
Makin_tosh
Участник


Сказали спасибо: +4/-0
Offline

Сообщений: 156


Re: GetShortPathNameW - пустая строка
« Ответ #12 : 09 Май 2012, 17:58:44 »

Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.146 секунд. Запросов: 22.