Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2009, 23:31   #1
voam
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 40
По умолчанию Некорректное определение короткого пути к директории

Добрый день!

Помогите, пожалуйста, разобраться в причине следующей проблемы.
Сразу отмечу, что проблема зафиксирована на нескольких машинах.

Я пытаюсь получить короткое имя файла или директории, используя следующий тестовый код:
Код:
Sub TestExtracting()
Dim Fsys As Scripting.FileSystemObject
Set Fsys = New FileSystemObject
Debug.Print Fsys.GetFile("E:\Temp\Программные файлы\Вордпадтруляля\абвгдеёжз.123").ShortName
Debug.Print Fsys.GetFolder("E:\Temp\Программные файлы\Вордпадтруляля\").ShortPath
End Sub
И вот результат преобразования:
Код:
016C~1.123 ' для имени файла
E:\Temp\C18B~1\DB57~1 ' для пути к директории
Т.е. ожидаемых абвгде~1.123 и E:\Temp\Програ~1\Вордпа~1 функции не возвращают.
Я пробовал напрямую использовать API-функцию GetShortPathName() - результат тот же. Пробовал вызывать функцию ExtractShortPathName в Delphi-приложении - снова тот же результат.
Очевидно, проблема какая-то системная ....
Подскажите, пожалуйста, в чем может быть причина?.. Очень нужно!

Заранее большое спасибо за помощь!
voam вне форума Ответить с цитированием
Старый 12.12.2009, 01:15   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Т.е. ожидаемых абвгде~1.123 и E:\Temp\Програ~1\Вордпа~1 функции не возвращают.
А почему Вы думаете, что именно такой результат - правильный?

Все программы выдают подобные короткие имена для папок\файлов, если в пути содержатся символы кириллицы:




Ещё говорят, что помогает переустановка Windows, а также
Цитата:
Борется присваиванием NtfsDisable8dot3NameCreation=0 в HKLM\SYSTEM\CurrentControlSet\Contr ol\FileSystem
Еще кое-что нашел:
Цитата:
GetShortPathName , она же GetShortPathNameA работает правильно, поскольку это всего лишь заглушка, реально работает GetShortPathNameW но для этого нужно преобразовать из ANSI в Юникод, но правильно система это может сделать только в рамках локализация и если локализация не русская, то и преобразование будет неверное. Спасение только в прямой работе с Юникодом, пока единственная версия Дельфи, которая это умеет - это 2009
Подробнее смотрите здесь

Последний раз редактировалось EducatedFool; 12.12.2009 в 01:22.
EducatedFool вне форума Ответить с цитированием
Старый 12.12.2009, 02:09   #3
voam
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 40
По умолчанию

Цитата:
Сообщение от EducatedFool
А почему Вы думаете, что именно такой результат - правильный?
Потому мне именно это нужно ... )))

Но, к сожалению, не все так просто, как может показаться на первый взгляд ...

EducatedFool, большое Вам спасибо за информацию! Видимо, придется искать какие-то альтернативные пути решения своей задачи ...

P.S.
Кстати, проверил первое предположение про запись в реестре - такое же значение у меня в системе уже установлено и, следовательно, этот метод не работает.
voam вне форума Ответить с цитированием
Старый 12.12.2009, 11:30   #4
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

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

EducatedFool, объяснения доходчивые и короткие, спасибо, а с альтернативными путями никто не поможет?

Цитата:
Сообщение от voam Посмотреть сообщение
Видимо, придется искать какие-то альтернативные пути решения своей задачи ...
я натолкнулся только на http://www.delphisources.ru/pages/fa...iles_name.html

что-то не слишком впечатляет результат (C:\fff\wwwwwwww\eeeeeee\QWEQWE\Гла вный пример.txt в C:\fff\wwwwwwww\..\Главный пример.txt)

может, кто-нибудь встречал готовое решение, укорачивающее названия папок? Вроде ничего сложного в реализации нет, но не хочется изобретать велосипед.
AnTe вне форума Ответить с цитированием
Старый 12.12.2009, 11:55   #5
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

EducatedFool очень заинтересовал скриншот в Вашем сообщении, а именно пункт контекстного меню - "Копировать путь".
Поскажите пожалуйста, как можно создать такое.
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 12.12.2009, 12:01   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
EducatedFool очень заинтересовал скриншот в Вашем сообщении
Это известная бесплатная программа Path2Clipboard
Присутствует в большинстве пиратских сборок Windows
EducatedFool вне форума Ответить с цитированием
Старый 12.12.2009, 12:32   #7
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Это известная бесплатная программа Path2Clipboard
Спасибо.
Оказывается у меня нет этой программки, нужно найти.)
**
Нашел, скачал, установил!
Еще раз большое спасибо
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499

Последний раз редактировалось VictorM; 12.12.2009 в 12:37.
VictorM вне форума Ответить с цитированием
Старый 12.12.2009, 12:38   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию 2 AnTe

Цитата:
что-то не слишком впечатляет результат (C:\fff\wwwwwwww\eeeeeee\QWEQWE\Гла вный пример.txt в C:\fff\wwwwwwww\..\Главный пример.txt)
Я в таких случаях просто вывожу строку "C:\fff\...\Главный пример.txt" либо QWEQWE\Главный пример.txt,
причем не усложняя код:
ТекстДляВывода= "C:\fff\...\" & ИмяФайла


А вообще для таких целей придумана специальная API-функция PathCompactPath
http://www.microsoft.com/Rus/Msdn/Ac...ystem/276.mspx


Вот вариант реализации обрезки пути без WinAPI: (взято здесь)
Код:
Function LongDirFix$(Incoming$, Max%)
    Dim i%, LblLen%, StringLen%, TempString$
    TempString$ = Incoming$
    If Len(TempString$) <= Max% Then
        LongDirFix$ = TempString$: Exit Function
    End If
    LblLen% = Max% - 6
    For i% = Len(TempString$) - LblLen% To Len(TempString$)
        If Mid$(TempString$, i%, 1) = "\" Then Exit For
    Next
    LongDirFix$ = Left$(TempString$, 3) + "..." + _
                  Right$(TempString$, Len(TempString$) - (i% - 1))
End Function

Sub ПримерИспользования()
    ДлинныйПуть$ = "C:\Documents and Settings\Игорь\Рабочий стол\CropPictures.xls"
    КороткийПуть$ = LongDirFix$(ДлинныйПуть$, 40)
    
    Debug.Print LongDirFix$(ДлинныйПуть$, 40) ' возвращает C:\...\Рабочий стол\CropPictures.xls
    Debug.Print LongDirFix$(ДлинныйПуть$, 30) ' возвращает C:\...\CropPictures.xls
End Sub

Последний раз редактировалось EducatedFool; 12.12.2009 в 12:58.
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Достать директории из полного пути к файлу Kuzya59 Общие вопросы Delphi 7 23.09.2009 13:08
Определение текущей директории Alex Cones Мультимедиа в Delphi 4 11.04.2009 12:32
Определение пути к папке Ntlegend Общие вопросы Delphi 6 01.04.2009 17:04
Определение полного пути папок TreeView vitawt Общие вопросы Delphi 8 22.02.2009 15:13
Определение пути к файлу Pinya Общие вопросы Delphi 1 07.08.2008 12:22