Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как получить имя файла без пути?

1.8K
20 марта 2006 года
erslgoeirjh
26 / / 16.12.2005
Есть некоторое полное имя файла -- myfilename типа char* , в котором присутствуют путь, собственно имя и расширение файла. Как мне с помощью WinAPI получить из myfilename имя файла с расширением, но без пути?
324
20 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by erslgoeirjh
Есть некоторое полное имя файла -- myfilename типа char* , в котором присутствуют путь, собственно имя и расширение файла. Как мне с помощью WinAPI получить из myfilename имя файла с расширением, но без пути?



Ищи последний "\". После него будет имя файла

7.9K
20 марта 2006 года
uki_
122 / / 26.01.2006
врятли есть в WinAPI такая ф-ия.
 
Код:
// char *chfullname - указатель на полное имя.
char *chfilename = NULL;
char *ch = strchr(chfullname, '\\\');
while(ch!=NULL)
{
  chfilename = ch + 1;
  ch = strchr(chfilename, '\\\');
}
406
20 марта 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by uki_
врятли есть в WinAPI такая ф-ия.
 
Код:
// char *chfullname - указатель на полное имя.
char *chfilename = NULL;
char *ch = strchr(chfullname, '\\\');
while(ch!=NULL)
{
  chfilename = ch + 1;
  ch = strchr(chfilename, '\\\');
}



Может в ВинАпи и нет зато в С Runtime Liabrary есть такая функция и называется она _splitpath.
Просто подключи <stdlib.h> и используй эту функцию.

7.9K
20 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by vitaly2003s
Может в ВинАпи и нет зато в С Runtime Liabrary есть такая функция и называется она _splitpath.
Просто подключи <stdlib.h> и используй эту функцию.

В WinAPI точно нет такой ф-ии.

 
Код:
...
  char path_buffer[_MAX_PATH];
  char drive[_MAX_DRIVE];
  char dir[_MAX_DIR];
  char fname[_MAX_FNAME];
  char ext[_MAX_EXT];
  ...
  _splitpath( path_buffer, drive, dir, fname, ext );
  ...
imho много лишней памяти.
 
Код:
// char *chfullname - указатель на полное имя.
char *chfilename = chfullname + strlen(chfullname) - 1;
while(*chfilename!='\\\')chfilename--;
chfilename++;
15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Цитата:
Originally posted by uki_
В WinAPI точно нет такой ф-ии.
 
Код:
...
  char path_buffer[_MAX_PATH];
  char drive[_MAX_DRIVE];
  char dir[_MAX_DIR];
  char fname[_MAX_FNAME];
  char ext[_MAX_EXT];
  ...
  _splitpath( path_buffer, drive, dir, fname, ext );
  ...
imho много лишней памяти.
 
Код:
// char *chfullname - указатель на полное имя.
char *chfilename = chfullname + strlen(chfullname) - 1;
while(*chfilename!='\\\')chfilename--;
chfilename++;



Упрощаем задачу до минимума :)

 
Код:
char *chfullname - указатель на полное имя.
char *path=strrchr(chfullname,'\\\');
if (path) *path=0;


Фактически оттяпыватся все что находится за последним слэшом - тобишь имя файла. А путь остается. Если конечно нужен закрывающий слэш - тогда так:
 
Код:
if (path) *(++path)=0;


Ну или чтобы совсем просто:

 
Код:
char *path;
char *chfullname;
if ((path=strrchr(chfullname,'\\\'))!=NULL) *(++path)=0;
7.9K
21 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by Red Alert
Упрощаем задачу до минимума :)

 
Код:
...
if (path) *path=0;

...
 
Код:
if (path) *(++path)=0;


Ну или чтобы совсем просто:

 
Код:
char *path;
char *chfullname;
if ((path=strrchr(chfullname,'\\\'))!=NULL) *(++path)=0;

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

15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Цитата:
Originally posted by uki_
Ничего личного, и прошу без обиды, но мне кажется, что тебя сегодня утром из кровати вытянули, но разбудить забыли.



А на что мне обижаться? Я конечно извиняюсь, может я не совсем понял суть вопроса, но просто привел максимально короткий код для выделения из имени файла пути. Или я не прав?

P.S. Жутко извиняюсь - забыл сказать что результирующий путь без имени файла по-прежнему будет в chfullname, path - это временная переменная - на нее внимания обращать не надо. Надо было конечно ее по-другому обозвать - лажанулся. Извиняюсь.

7.9K
21 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by Red Alert
А на что мне обижаться? Я конечно извиняюсь, может я не совсем понял суть вопроса, но просто привел максимально короткий код для выделения из имени файла пути. Или я не прав?

Нужен указатель на имя файла. Этим мог бы быть path, если просто path++. Но на счет *(++path)=0; вспоминаются слова пассажира Титаника, который находясь в воде и увидев айсберг, сказал: это правда, что я к шампанскому заказывал льда, но это уже явный перебор. Шутка :)

15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Цитата:
Originally posted by uki_
Нужен указатель на имя файла. Этим мог бы быть path, если просто path++. Но на счет *(++path)=0; вспоминаются слова пассажира Титаника, который находясь в воде и увидев айсберг, сказал: это правда, что я к шампанскому заказывал льда, но это уже явный перебор. Шутка :)



Значит я неверно понял. Тогда прошу прощения. Если нужно имя файла а не путь к нему, тогда действительно надо делать path++.
*(++path)=0; - это для выделения пути. Сглючил :)

395
21 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by Red Alert
Значит я неверно понял. Тогда прошу прощения. Если нужно имя файла а не путь к нему, тогда действительно надо делать path++.
*(++path)=0; - это для выделения пути. Сглючил :)


А почему никто не хочет использовать MFC?
Ведь самое простое по моему это так...

 
Код:
CString sPath = path;
CString fName = sPath.GetBuffer() + sPath.ReverseFind(_T('\\\')) + 1;
713
21 марта 2006 года
Ap0k
360 / / 13.03.2006
Цитата:
Originally posted by RelB
А почему никто не хочет использовать MFC?
Ведь самое простое по моему это так...
 
Код:
CString sPath = path;
CString fName = sPath.GetBuffer() + sPath.ReverseFind(_T('\\\')) + 1;


А как же
PathFindFileName + PathFindExtension ?

395
21 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by Ap0k
А как же
PathFindFileName + PathFindExtension ?


А говорили нет API-шных функций... :)

7.9K
21 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by RelB
А говорили нет API-шных функций... :)

Я имел в виду Win32 API.:{

96K
29 июля 2015 года
_alex64
1 / / 29.07.2015
Цитата: AndreySar
Цитата:
Originally posted by erslgoeirjh
Есть некоторое полное имя файла -- myfilename типа char* , в котором присутствуют путь, собственно имя и расширение файла. Как мне с помощью WinAPI получить из myfilename имя файла с расширением, но без пути?

Ищи последний "". После него будет имя файла

Может не сработать, если файл лежит в корне диска. Типа:
G:файл_в_корне_флешки.txt
_splitpath() в этом отношении надежнее.

85K
30 июля 2015 года
Иван Лазарев
18 / / 25.06.2015
мдя, вот вы себе голову задурили указателями. В .NET вся эта муть укладывается в одну строку:
path.Substring (path.LatIndexOf ("\") + 1)
.
Цитата: _alex64
Цитата: AndreySar
Цитата:
Originally posted by erslgoeirjh
Есть некоторое полное имя файла -- myfilename типа char* , в котором присутствуют путь, собственно имя и расширение файла. Как мне с помощью WinAPI получить из myfilename имя файла с расширением, но без пути?

Ищи последний "\". После него будет имя файла

Может не сработать, если файл лежит в корне диска. Типа:
G:\файл_в_корне_флешки.txt
_splitpath() в этом отношении надежнее.

Это почему же не сработает, мне прям очень интересно стало?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог