Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кириллица в пути к файлу 
:(
    Опции темы
naigo
Дата 18.7.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2006

Репутация: нет
Всего: нет



есть утилита которая проводит дефрагментацию отдельных файлов и всё бы хорошо, но не понимает она пути типа "C:\Documents and Settings\usver\Главное меню\Программы\AviSynth"
но зато чудесно работает с равнозначным путём : C:\DOCUME~1\usver\5D29~1\4A66~1\AVISYN~1
никто из уважаемых программистов не подскажет как преобразовать 
"Главное меню => 5D29~1"
"Программы => 4A66~1"

 
PM MAIL   Вверх
chaos
Дата 5.10.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



PM WWW   Вверх
amg
Дата 5.10.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Короткие имена файлов можно попробовать получить так (NT4):
Код

dir /x "C:\Dir" | perl -lane "/^ / || print F[3]"

А преобразовать вместе с путем не знаю как. Может, модуль для этого есть?
PM MAIL   Вверх
nitr
Дата 5.10.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



naigo, попробуй в кавычки заключать путь...

Добавлено @ 12:58 
т.е. там где твоему дефрагментатору передаётся путь
примерно так
defrag($path);

сделай defrag("\"$path\"");

Добавлено @ 13:05 
5D29~1\4A66~1
а такое странно... т.к. должно быть 6сиволов + ~1... я таких путей не видел...
ты как такое получил преобразование?


--------------------
PM   Вверх
chaos
Дата 6.10.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



nitr, 
Код

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

c:\>cd c:\DOCUME~1

C:\DOCUME~1>dir
 Том в устройстве C имеет метку System
 Серийный номер тома: 0400-6507

 Содержимое папки C:\DOCUME~1

30.08.2006  12:54    <DIR>          .
30.08.2006  12:54    <DIR>          ..
22.06.2006  15:18    <DIR>          admin
24.09.2006  13:41    <DIR>          All Users
07.08.2006  00:29    <DIR>          bigdrive
03.07.2006  16:10    <DIR>          eugene
30.08.2006  12:54    <DIR>          HQ-DKONONENKO
04.10.2006  14:58    <DIR>          kononenko
24.07.2006  15:38    <DIR>          mag
28.08.2006  13:19    <DIR>          rey
23.06.2006  17:39    <DIR>          Администратор
               0 файлов              0 байт
              11 папок  23 441 965 056 байт свободно

C:\DOCUME~1>cd .\kononenko

C:\DOCUME~1\kononenko>cd .\5D29~1

C:\DOCUME~1\kononenko\5D29~1>dir
 Том в устройстве C имеет метку System
 Серийный номер тома: 0400-6507

 Содержимое папки C:\DOCUME~1\kononenko\5D29~1

22.06.2006  21:03    <DIR>          .
22.06.2006  21:03    <DIR>          ..
04.10.2006  10:30    <DIR>          Программы
               0 файлов              0 байт
               3 папок  23 441 965 056 байт свободно

C:\DOCUME~1\kononenko\5D29~1>cd .\4A66~1

C:\DOCUME~1\kononenko\5D29~1\4A66~1>dir
 Том в устройстве C имеет метку System
 Серийный номер тома: 0400-6507

 Содержимое папки C:\DOCUME~1\kononenko\5D29~1\4A66~1

04.10.2006  10:30    <DIR>          .
04.10.2006  10:30    <DIR>          ..
04.10.2006  10:30    <DIR>          Altdesk
06.07.2006  11:52    <DIR>          IB Expert 2.0
22.06.2006  16:19               773 Internet Explorer.lnk
20.07.2006  09:50    <DIR>          ISQL for MSSQL
24.07.2006  09:22    <DIR>          Microsoft Web Publishing
27.06.2006  10:29    <DIR>          Object Desktop
03.08.2006  16:20    <DIR>          PLSQL Developer
26.06.2006  17:06    <DIR>          Softerra LDAP Browser 2.6
27.06.2006  11:38    <DIR>          SysMetrix
12.07.2006  11:25    <DIR>          Virtual DJ
22.06.2006  16:22    <DIR>          WinRAR
22.06.2006  17:38    <DIR>          Автозагрузка
22.06.2006  18:09    <DIR>          Администрирование
27.06.2006  14:10               798 Проигрыватель Windows Media.lnk
22.06.2006  16:19    <DIR>          Стандартные
22.06.2006  15:13             1 599 Удаленный помощник.lnk
               3 файлов          3 170 байт
              15 папок  23 441 965 056 байт свободно

C:\DOCUME~1\kononenko\5D29~1\4A66~1>

PM WWW   Вверх
nitr
Дата 6.10.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



chaos, не проще ли?
dir "path" ?


--------------------
PM   Вверх
amg
Дата 9.10.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Написал скриптик, который полные длинные имена преобразует в короткие (просто парсит вывод команды dir /x). Кто-нибудь, проверьте, пожалуйста, а то у меня только NT4. Запускается 
Код

perl script.pl long_names.txt > short_names.txt
Файл long_names.txt, содержащий длинные имена (по одному на строку) должен быть в досовской кодировке, если есть русские буквы. Нужно иметь в виду, что получать короткие имена нужно "сейчас" и "тут", в другое время на другой машине у одинаковых длинных имен могут быть разные короткие.
Код
while (<>) {
  chomp;
  s/\\$//; s/^\\//;
  $_ = ".\\$_" unless /^[a-z]:\\/i || /^\./;
  
  @names = split /\\/, $_;
  $short_path = shift @names;
  $long_path = $short_path;
  $hash{$long_path} = $short_path;

  while (@names) {
    $next_long = shift @names;
    if ( $hash{"$long_path\\$next_long"} ) {
      $long_path = "$long_path\\$next_long";
      $short_path = $hash{$long_path};
    } else {
      $long_path .= "\\"; 
      $short_path .= "\\";
      
      @a = grep {!/^\s/ && /\s+$next_long$/i} `dir /x \"$long_path\"`;
      $next_short = (split /\s+/, "@a")[3];
      
      unless ($next_short) {
        print "Error: $short_path$next_long not exist\n";
        undef $short_path;
        last;
      }
  
      $short_path .= "$next_short";
      $long_path  .= "$next_long";
      $hash{$long_path} = $short_path;
    }
  } 
  print "$short_path\n" if $short_path;
}



Это сообщение отредактировал(а) amg - 9.10.2006, 12:59
PM MAIL   Вверх
chaos
Дата 9.10.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



amg, не изобретай велосипед!!! В Win API есть функция GetShortPathName

и оказалось что есть такая и в перл модуле Win32
Код

Win32::GetShortPathName LONGPATHNAME 
Returns the short (8.3) pathname for LONGPATHNAME:


пример:
Код

use Win32;
$short = Win32::GetShortPathName('words.secret');   # $short now has 8.3 name (WORDS~1.SEC)


PM WWW   Вверх
amg
Дата 9.10.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(chaos @  9.10.2006,  13:59 Найти цитируемый пост)
и оказалось что есть такая и в перл модуле Win32
А я и не знал. Жалко, раньше ты этого не сказал. (Искать пробовал, но не нашел).

PM MAIL   Вверх
chaos
Дата 9.10.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



хотя можно теоретически "дернуть" любую функцию из Win API c с помощью Win32::GetProcAddress
PM WWW   Вверх
amg
Дата 10.10.2006, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Да, с использованием Win32::GetShortPathName гораздо проще и работает гораздо быстрее. 

Но я все же нашел применение и своему скрипту: если на машине не стоит дистрибутив Perl, то можно просто поместить в любую директорию скрипт, а также два файла, perl.exe и perl58.dll (поместится даже на дискету), и скрипт будет работать.
PM MAIL   Вверх
chaos
Дата 10.10.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



можно вызывать функцию с помощью rundll32.exe

Добавлено @ 11:37 
а, не получиться! rundll32.exe умеет выполнять только функции с одним параметром. так что не прокатит
PM WWW   Вверх
naigo
Дата 30.12.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2006

Репутация: нет
Всего: нет



Всем участникам Огромное спасибо за помощь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.