Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Преобразование в длинное имя файла по короткому.   Найти похожие ветки 

 
t100   (2004-06-07 07:53) [0]

Привет.Тривиальный,может быть тупой вопрос,который часто встречается,но КАК???


 
sniknik ©   (2004-06-07 08:23) [1]

можно просто FindFirst с заданным по короткому, должно вернуть длинное. или GetFullPathName но она тоже будет диск читать (так думаю) потому что есть короткие имена которые различаются только порядковым номером в таблице размещения файлов, по другому узнать верное имя не получится.


 
SkyRanger ©   (2004-06-07 08:28) [2]

Восстанавление длинных имен файлов по известным коротким
--------------------------------------------------------------------------------

Автор: Boris  

Мой Windows понима~1 длинны~1 имена, а твой?  


//---------------------------------------------------------------------
// Восстанавливает длинные имена файлов по известным коротким (8.3)
// В качестве аргумента принимает полный или неполный (в т.ч. относительный)
// путь к файлу, например "C:\WINDOWS\РАБОЧИ~1\ИТАКДА~1.LNK" или
// "..\..\COMMON~1\BORLAN~1\BDE\BDEREA~1.TXT". Понимает сетевые имена.
// Возвращает полный(!) путь типа "C:\Windows\Рабочий стол\и так далее.lnk",
// "C:\Program Files\Common Files\Borland Shared\BDE\bdereadme.txt",
// "\\Computer\resource\Folder with long name\File with long name.ext"
//---------------------------------------------------------------------

function RestoreLongName(fn: string): string;

 function LookupLongName(const filename: string): string;
 var
   sr: TSearchRec;
 begin
   if FindFirst(filename, faAnyFile, sr) = 0 then
     Result := sr.Name
   else
     Result := ExtractFileName(filename);
   SysUtils.FindClose(sr);
 end;
 function GetNextFN: string;
 var
   i: integer;
 begin
   Result := "";
   if Pos("\\", fn) = 1 then
   begin
     Result := "\\";
     fn := Copy(fn, 3, length(fn) - 2);
     i := Pos("\", fn);
     if i <> 0 then
     begin
       Result := Result + Copy(fn, 1, i);
       fn := Copy(fn, i + 1, length(fn) - i);
     end;
   end;
   i := Pos("\", fn);
   if i <> 0 then
   begin
     Result := Result + Copy(fn, 1, i - 1);
     fn := Copy(fn, i + 1, length(fn) - i);
   end
   else
   begin
     Result := Result + fn;
     fn := "";
   end;
 end;
var
 name: string;
begin

 fn := ExpandFileName(fn);
 Result := GetNextFN;
 repeat
   name := GetNextFN;
   Result := Result + "\" + LookupLongName(Result + "\" + name);
 until length(fn) = 0;
end;


Взято из http://Delphiworld.narod.ru


 
t100   (2004-06-07 08:35) [3]

Я нашел раньше этот исходник,но туплю или он не работает.
RestoreLongName(имя короткого файла),а как возвратить длинное?


 
Anatoly Podgoretsky ©   (2004-06-07 08:40) [4]

Ты хочешь чтобы на основании такой короткой информации мы определели тупишь ты или нет?


 
t100   (2004-06-07 08:43) [5]

Как передать функции короткое имя,а она возвратила длинное имя файла.Вот такой я тупой...


 
Anatoly Podgoretsky ©   (2004-06-07 08:54) [6]

Да просто S := RestoreLongName(S)


 
t100   (2004-06-07 09:14) [7]

Функция возвращает путь и КОРОТКОЕ имя файла!!! Значит есть надежда,что я не туплю:-)


 
Григорьев Антон   (2004-06-07 09:15) [8]

Есть системная функция GetLongPathName, которая делает то, что нужно. Правда, для неё требуется Windows 2000 или 98 и выше.


 
sniknik ©   (2004-06-07 11:50) [9]

> Функция возвращает путь и КОРОТКОЕ имя файла!!! Значит есть надежда,что я не туплю:-)
наоборот со страшной силой. ;о)
задаеш путь который есть и файл которого нет.

позволил себе немного модифицировать данную процедуру, так будет понятней, замени LookupLongName этим

function LookupLongName(const filename: string): string;
var
  sr: TSearchRec;
begin
  if FindFirst(filename, faAnyFile, sr) = 0 then begin
    Result := sr.Name;
    FindClose(sr);
  end else
    Result := "Завать только существующие имена/пути!!!"; //ExtractFileName(filename);
end;


 
t100   (2004-06-07 14:52) [10]

НЕ РАБОТАЕТ функция и все!!!


 
t100   (2004-06-07 15:21) [11]

Мне нужно,чтобы вместо РУКОВО~1.DOC получалось РУКОВОДСТВО.DOC!!!


 
sniknik ©   (2004-06-07 15:32) [12]

> НЕ РАБОТАЕТ функция и все!!!
не может быть.

еще раз, если задаеш несуществуюший путь/имя на этом компе то вернет то же что и задавал. (или в моем варианте D:\Задавать только существующие имена/пути!!!\Задавать только существующие имена/пути!!! (не существует путь с первого же каталога))
выполни вот это что видиш в 1/2м лейбеле?

 if OpenDialog1.Execute then begin
   st:= OpenDialog1.FileName;
   GetShortPathName(@st[1], @st[1], length(st));
   Label1.Caption:= st;
   Label2.Caption:= RestoreLongName(Label1.Caption);
 end;  


 
sniknik ©   (2004-06-07 15:33) [13]

> Мне нужно,чтобы вместо РУКОВО~1.DOC получалось РУКОВОДСТВО.DOC!!!
а файл такой есть на компьютере? с именем РУКОВОДСТВО.DOC? вот это очень важная состовляющая.


 
Romkin ©   (2004-06-07 15:34) [14]

А что, GetFullPathName разве не подходит?


 
sniknik ©   (2004-06-07 15:36) [15]

Romkin ©   (07.06.04 15:34) [14]
предлагал, еще в [1] но чегото уперлись в этот код, он ведь видиш говорит неработает, а это несправедливо по отношению к автору. код рабочий.


 
t100   (2004-06-07 15:57) [16]

Файл существует,но имя не преобразовывается.
Исходник с лэйвлами работает,но ВСЕ ТОЖЕ ИМЯ ФАЙЛА,хотя путь преобразовывает.


 
Anatoly Podgoretsky ©   (2004-06-07 16:01) [17]

Чем докажешь что файл существует, может тебе просто кажется.


 
Gero ©   (2004-06-07 16:03) [18]


> t100   (07.06.04 15:21)
> Мне нужно

Раз НУЖНО - так НАПИШИ.
Что, своих мозгов нет?
К тому же тебе дали кучу примеров.
Не всегда же за тебя другие думать будут.


 
t100   (2004-06-07 16:12) [19]

>Чем докажешь что файл существует, может тебе просто кажется.
Могу выслать по почте.


 
Anatoly Podgoretsky ©   (2004-06-07 16:18) [20]

t100   (07.06.04 16:12) [19]
Это не есть доказательство.
За все время ты ни разу не привел имен, информации о том как передаешь и какие конкретные значения, текущий каталог.


 
t100   (2004-06-07 16:29) [21]

Есть файл ДО9D77~1.DOC,находящийся в папке C:\Documents and Settings\numas\Рабочий стол\прокурор.Реальное имя файла ДОГОВОР ПОДРЯДА.DOC.
Используя
  if OpenDialog1.Execute then begin
  st:= OpenDialog1.FileName;
  GetShortPathName(@st[1], @st[1], length(st));
  Label1.Caption:= st;
  Label2.Caption:= RestoreLongName(Label1.Caption);
end;  
получаем  Label1.Caption имеет значение C:\DOCUME~1\numas\0016~1\6DEF~1\9D77~1~1.DOC,а  Label2.Caption -C:\Documents and Settings\numas\Рабочий стол\прокурор\ДО9D77~1.DOC,ГДЕ ЖЕ преобразование имени файла?


 
Romkin ©   (2004-06-07 16:47) [22]

А в эксплорере этот файл смотрится именно как ДОГОВОР ПОДРЯДА.DOC ?


 
Anatoly Podgoretsky ©   (2004-06-07 16:51) [23]

RestoreLongName работает по текущему каталогу, будь добр удалить путь и сделать папку текущей.
По абсолютному пути работает sniknik ©   (07.06.04 11:50) [9]


 
Anatoly Podgoretsky ©   (2004-06-07 16:54) [24]

Romkin ©   (07.06.04 16:47) [22]
Неизваестно, это он опять нам забыл сказать

 st:= OpenDialog1.FileName;
 GetShortPathName(@st[1], @st[1], length(st));  Label1.Caption:= st;


 
t100   (2004-06-07 16:55) [25]

нет,смотрится как ДО9D77~1.DOC,в подсказке при наведении курсора заголовок файла ДОГОВОР ПОДРЯДА.DOC .


 
Anatoly Podgoretsky ©   (2004-06-07 16:58) [26]

t100   (07.06.04 16:55) [25]
Чего же ты хочешь, у тебя вообще нет длинного имени как такового, а курсор показывает свойства документа.


 
t100   (2004-06-07 17:02) [27]

Проблема то в том,что после не корректной установки ОС все имена файлов покаверкались на короткие,а хотелось бы их восстановить на длинные.


 
t100   (2004-06-07 17:06) [28]

Может выдирать с каждого такого вордовского файла первое предложение(определенное кол-во символов) и переименовывать имя в них?


 
Romkin ©   (2004-06-07 17:10) [29]

Вот с этого начинать надо было. Заметь, совершенно другой вопрос, нежели субж!
Тебе нужно взять имя документа и переименовать файл, дав ему это имя.


 
t100   (2004-06-07 17:17) [30]

Да,но теперь,что значит "взять имя документа"?


 
t100   (2004-06-07 17:27) [31]

Дайте тогда может кто ссылку,пожалуйста, для работы с документами Word через OLE.


 
Romkin ©   (2004-06-07 17:31) [32]

У некоторых файлов есть свойства. Особенно это относится к документам офиса. Если в ворде вызвать свойства документа, то их вполне можно увидеть. То же самое, если посмотреть свойства файла. У меня, например, на вкладке "Документ" есть поле Название.
И любое из этих свойств можно достать, через ActiveX. Многие свойства предопределены, например, название - это PIDSI_TITLE ;)
А достается все это через stgOpenStorage и юзание IPropertySet
В инете наверняка полно всего по этому вопросу. Если нет - плиз дальнейшие вопросы в новом топике в Corba & COM


 
sniknik ©   (2004-06-07 19:34) [33]

> У некоторых файлов есть свойства.
> меня, например, на вкладке "Документ" есть поле Название.
и они не всегда совпадают, открыл первы попавшийся doc
имя файла
Рассогласование данных в чеке.doc
а на вкладке в поле название
Проблема :  рассогласование данных в чеке и базе при параллельной загрузке

что согласитесь не одно и тоже ;о), файл не мой. думаю сначала сохранен в ворде а название после подкорректировано.


 
t100   (2004-06-08 07:55) [34]

Спасибо всем!


 
Koster   (2004-06-08 18:59) [35]

Во флэйм...



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.029 c
1-1086636595
Duk
2004-06-07 23:29
2004.06.20
Потоки


3-1085648391
Marik
2004-05-27 12:59
2004.06.20
Снова про поиск


1-1086292365
TGrey
2004-06-03 23:52
2004.06.20
TThread


1-1086275670
Funnymind
2004-06-03 19:14
2004.06.20
Про пути дороги


6-1083480866
lucky4me
2004-05-02 10:54
2004.06.20
Закачка HTTP