Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: GetShortPathName  (Прочитано 17438 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 26-03-2009 13:34 » 

мне именно сюда Отлично

не получается преобразовать в короткий путь строку
D:\Алексей\1---Каменск-Уральский
 - возвращается пустая строка

почемур ?
Код:
{
CString txt="D:\\Алексей\\1---Каменск-Уральский";
char txt_ShrtPath[MAX_PATH+1];
::memset(txt_ShrtPath,0,sizeof(txt_ShrtPath));
::GetShortPathName(txt,txt_ShrtPath,sizeof(txt_ShrtPath)-1);
}

русские буквы ? Хотя вот такая строка
D:\Алексей\1---Каменск-Уральский (защита-универсал)\base_2009_03_26_092734.fbk

абсолютно легко преобразовалась
D:\07C4~1\1----(~\BASE_2~1.FBK

(сорри за тупые примеры, на эксперименты нет времени, взял пути, как они есть)
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 26-03-2009 16:20 » 

Лёш, а я стесняюсь спросить, а путь реально на диске существует? Ага А иначе как эта ф-я тебе чегойнта там вычислит?

зы А ещё надо опросить возвращаемую длину буфера при нулевых параметрах 2 и 3 и в случае ошибки позвать на помощь GetLastError
« Последнее редактирование: 26-03-2009 16:23 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 26-03-2009 16:37 » 

естественно существует, а откуда бы я такой тупой путь взял ? )))

насчёт длины - длинее MAX_PATH быть не может в этом случае

или обязательно файл должен быть в конце пути ?
« Последнее редактирование: 26-03-2009 16:41 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 26-03-2009 16:59 » 

блин, дома всё работает ((

повнимательнее завтра на работе попробую
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 26-03-2009 20:43 » 

Ну я откуда знаю, может ты просто строчку решил передать.

Нет, Лёш, это примерно так делается

long length = ::GetShortPathName(txt,NULL,0);

if(length) { ::GetLastError ... return; }

Файл не должен быть в конце пути. Всё работает без файла.

TCHAR *psz = new TCHAR[length];

length = ::GetShortPathName(txt,psz,length);

if(length) ...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 26-03-2009 21:48 » 

хорошо, попробую. Но вряд ли дело в длине - она явно меньше MAX_PATH
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 27-03-2009 03:46 » 

Джонище, ну ты был прав - это же был путь сохранения файла, то есть путь к папке то есть, а самого файла то ещё нету Улыбаюсь))

Утром проснулся и понял

эхъ....
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 27-03-2009 04:56 » 

Бывает...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 27-03-2009 10:17 » 

а вот так
Код:
//проверка файла на существование
//проверяет как файл, так и папку.
//Если надо найти папку, а в имени искомой папки
//на конце есть слеш, - то приписать "*", тогда
//папка найдётся

bool st_IsFileExists(LPCSTR lpPathName)
{
HANDLE file=0;

WIN32_FIND_DATA w32fd;

::memset(&w32fd,0,sizeof(w32fd));
w32fd.ftCreationTime.dwHighDateTime=-1;
w32fd.ftLastAccessTime.dwHighDateTime=-1;
w32fd.ftLastWriteTime.dwHighDateTime=-1;
w32fd.nFileSizeHigh=-1;
w32fd.nFileSizeLow=-1;

file=::FindFirstFile(lpPathName,&w32fd);
if(file==INVALID_HANDLE_VALUE || file==0)
{
//файл не найден
return false;
}

//файл найден
::FindClose(file);

//реальное имя найденного файла
//w32fd.cFileName;

return true;
}


//создать директорию- обеспечить создание полного пути к, если его нету
//(!!! ДОДЕЛАТЬ !!!)
BOOL st_CreateDirectoryEnsureFullPath(
    LPCSTR lpPathName,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes=0
    )
{

CString PathToCr__=lpPathName;

if(PathToCr__.GetLength()<=0)return 0;


//обеспечиваем слеш на конце
if(PathToCr__[PathToCr__.GetLength()-1]!='\\')
{
PathToCr__+='\\';
}

if(st_IsFileExists(PathToCr__+'*'))return 1;


if(!::CreateDirectory(lpPathName,lpSecurityAttributes))
{
DWORD dwd=::GetLastError();

//Cannot create a file when that file already exists. ERROR_ALREADY_EXISTS
if(dwd==ERROR_ALREADY_EXISTS)
{
}
else
{
//возможно, есть вложенности
CString txt="cmd.exe /q /c md "+PathToCr__;
st_RunProcessAndWaitWhenDone(0,txt);
}
}

if(st_IsFileExists(PathToCr__+'*'))return 1;

return 0;
}


//Zuko - это такой мерзкий сок в порошке был, если кто помнит ))
//bHasFileAtEndOfThePath - это уточнение на случай, когда путь ещё не существует или существует не полностью
CString st_GetShortPathNameSmartZuko(const char* pchLongPath)
{
CString csResult="";
CString csSource=pchLongPath;

if(csSource=="")return"";

//определяем, существует ли объект, указанный в пути, а также

bool bWasSlash=false;

//убираем слеш с конца пути, если он там
while(csSource[csSource.GetLength()-1]=='\\')
{
bWasSlash=true;
csSource=csSource.Left(csSource.GetLength()-1);
}

bool dWasExists=false;
if(st_IsFileExists(csSource))
{
//объект существует
dWasExists=true;
}

bool dTestWasCreated=false;
//если файл не существует ещё, тупо пытаемся создать такую
if(!dWasExists)
{
//создаём тестовый путь, если надо. Создастся папка с именем, как у будущего файла
if(st_CreateDirectoryEnsureFullPath(csSource))
{
dTestWasCreated=true;
}
}

DWORD dwdLen=::GetShortPathName(csSource,0,0);
if(dwdLen)
{
//буфер для коротыша
char* pShort=new char[dwdLen+1];
::memset(pShort,0,dwdLen+1);
::GetShortPathName(csSource,pShort,dwdLen);
csResult=pShort;
delete [] pShort;
pShort=0;
}

//удалить тестовый папк (однако весь "хвост" предыдущих папок остаётся)
if(dTestWasCreated)
{
::RemoveDirectory(csSource);
}

if(bWasSlash)
{
csResult+='\\';
}

return csResult;
}

пример вызова

Код:
CString csSh="";
csSh=st_GetShortPathNameSmartZuko("c:\\2ы22\\339ы3\\\\\\\\");
csSh=st_GetShortPathNameSmartZuko("c:\\2ы22\\33ы3");
csSh=st_GetShortPathNameSmartZuko("c:\\3ы33\\44ы4\\");
csSh=st_GetShortPathNameSmartZuko("c:\\55ы5\\6ы66\\fff");
csSh=st_GetShortPathNameSmartZuko("~c:\\55ы5\\6ы66\\fff");
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines