:: Visual Foxpro, Foxpro for DOS
Прочитать имя файла с Unicode-символами
Nick_nsk

Сообщений: 33
Дата регистрации: 20.10.2006
Простейшая задача - получить список файлов в каталоге и его обработать.
Проблема: в именах файлов встречаются Unicode - символы:

после ADIR вместо Nohr.txt (второй знак - греческое "o", перечеркнутое)
я вижу Nohr.txt с обычным ASCII символом "o"

Естественно, при попытке обращения к файлу получаю ошибку.

Можно их переименовать, но как получить правильную текстовую строку, чтобы в дальнейшем с помощью

loFSO = CREATEOBJECT('Scripting.FileSystemObject')
If loFSO.FileExists(lcFile2Examinate)
loTFile=loFSO.GetFile(lcFile2Examinate)
loTFile.Name=New_name
Endif

переименовать в обычный ASCII
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Рекурсивный просмотр папок с помщью FSO
CLEAR
ret_val = ''
show_dir("C:\Exchange","primer.rar",@ret_val)
?ret_val
FUNCTION show_dir(cFolder,fName,ret_val)
o=CreateObject("Scripting.FileSystemObject")
loDir=o.GetFolder(cFolder)
For each loFolder in loDir.SubFolders
FOR EACH oo IN loDir.Files
IF LOWER(oo.name) = LOWER(fName)
ret_val = ret_val + ADDBS(cFolder)+oo.name+CHR(13)+CHR(10)
RETURN
ENDIF
endfor
show_dir(ADDBS(cFolder)+loFolder.Name, fName, @ret_val)
Next
Думаю, FSO юникод нормально потребит, если пример допилить.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Nick_nsk

Сообщений: 33
Дата регистрации: 20.10.2006
Влад, спасибо!
Проверяю.
До понедельника отбыл на дачу, о результатах сообщу.
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Влад Колосов
Думаю, FSO юникод нормально потребит, если пример допилить.
А что там должно в итоге получаться? Что-то этот пример вообще ничего не показывает. Ты его сам пробовал с юникод-именами?
Специально вот создал файл с юникод-именем, кинул в папку с нормальными файлами, запустил этот код, только он сразу же и завершается без всяких циклов.
Хотя так по идее что-то такое через FSO конечно же и возможно.
Из любопытства незадолго перед тем попробовал другой вариант, мелькнула такая идея - переименовать все в 8-dos имена через xcopy. Так там все получается вроде и нормально для фокса. Но как-то оно не так красиво как с FSO. Само собой с ним было бы интереснее сделать.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Я не совсем понимаю, откуда в именах берется юникод... Может так вообще нельзя делать.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Nick_nsk

Сообщений: 33
Дата регистрации: 20.10.2006
Файлы с юникодом берутся пользователями с И-нета, качаются с итальянских, греческих и пр.сайтов. Спокойно выкладываются в каталоги, открываются, переименовываются explorer-ом, копируются и т.д. Объяснить пользователям почему они неправильные сложно. Некоторые символы выглядят вполне безобидно, как asci знак+кавычка.

Проверил:
Для эксперимента упростил код:
Проверяю наличие единственного файла в каталоге c:\temp

Получаем 'нет файла ...'

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

Если второй знак имени файла изменить на ASCII, сразу получим сообщение 'Есть файл '

PROCEDURE tmp1
CLEAR
ret_val = ''
show_dir("c:\temp",@ret_val)
RETURN
FUNCTION show_dir(cFolder,fName,ret_val)
o=CreateObject("Scripting.FileSystemObject")
loDir=o.GetFolder(cFolder)
For each loFolder in loDir.SubFolders &&Getfolder отработал
FOR EACH oo IN loDir.Files
ret_val=ADDBS(cFolder)+oo.name
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
If loFSO.FileExists(ret_val)
WAIT WINDOW 'Есть файл ' + ret_val
ELSE
WAIT WINDOW 'нет файла ' + ret_val
Endif
Release loFSO
RETURN
endfor
endfor
retu

В принципе, именно то, что FileExists (и обычный File() после ADIR) его не обнаруживает, и является признаком того, что с именем файла непорядок.
А дальше, действительно, попробовать переименовать через 8-dos имена
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
technik
Автор

Сообщений: 264
Откуда: С-Петербург
Дата регистрации: 15.11.2006
А если так
For each loFolder in loDir.SubFolders &&Getfolder отработал
FOR EACH oFile IN loDir.Files
?oFile.ShortPath
?oFile.ShortName
?"Файл " + iif(File(addbs(oFile.ShortPath) + oFile.ShortName), ;
"найден", "не найден")
endfor
endfor
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Nick_nsk

Сообщений: 33
Дата регистрации: 20.10.2006
В коде

?"Файл " + iif(File(addbs(oFile.ShortPath) + oFile.ShortName), ;
"найден", "не найден")

+ oFile.ShortName излишне, oFile.ShortPath уже содержит имя файла


Проверил - то же самое. Видит ТОЛЬКО ASCII имена файлов, как только вставляю с Юникод знаком - "нет файла..."

Полный тест процедуры:

PROCEDURE tmp2
CLEAR
ret_val = ''
show_dir("c:\temp",@ret_val)
RETURN
FUNCTION show_dir(cFolder,fName,ret_val)
o=CreateObject("Scripting.FileSystemObject")
loDir=o.GetFolder(cFolder)
For each loFolder in loDir.SubFolders &&Getfolder отработал
FOR EACH oFile IN loDir.Files
?(oFile.ShortPath)
?"Файл " + iif(FILE(oFile.ShortPath),"НАЙДЕН!", "не найден...")
endfor
endfor
retu
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
technik
Автор

Сообщений: 264
Откуда: С-Петербург
Дата регистрации: 15.11.2006
Мне кажется, что здесь преобразования завязаны на системные настройки языков и кодовых страниц систеиы. См. Язык и региональные стандарты->языки/дополнительно. Возможно нужно включить тексовые службы для восточных языков
Или установить MUI



Исправлено 1 раз(а). Последнее : technik, 06.07.09 15:39
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Чтобы получить имена файлов в уникоде можно воспользоваться функциями FindFirstFileW и FindNextFileW (см. MSDN)
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
technik
Автор

Сообщений: 264
Откуда: С-Петербург
Дата регистрации: 15.11.2006
leonid
Чтобы получить имена файлов в уникоде можно воспользоваться функциями FindFirstFileW и FindNextFileW (см. MSDN)

Это понятно, что средствами winapi это возможно. А как заставить работать системные com-объекты: FSO,WMI, wshell и др. где есть доступ к файловой системе. Или они в зависимости от региона/windows имеют разную реализацию?
Или нужно играться командами sys()-3101,3004-3006 или COMPROP(,"UTF8",1).
Имя файла получили, но его обратно нужно передавать - опять winapi unicode?
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ADIR() видит по короткому имени (если в качестве шаблона его дать). Также filetostr() может прочитать. FILE() не видит, COPY/RENAME/DELETE FILE так-же по короткому имени не работают...
Банальное
oFile.Name = m.oFile.Name
"лечит" юникодовские символоы в именах - конечно же если в результате "лечения" получается дублирующееся в папке имя, то будет сгенерирована ошибка...
P.S. Стараюсь не иметь дела с такими файлами (переименовываю их), т.к. Юникодовский FAR пока не стабилен, а "старый" 1.70 тоже имеет существенные проблемы с такими именами. Некоторые архиваторы из "старых" тоже не жалуют юникод.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
technik
Автор

Сообщений: 264
Откуда: С-Петербург
Дата регистрации: 15.11.2006
В привиденном ниже примере файл находиться в 4х из шести методов. Т.е. ADIR() и sys(2000) по короткому пути и FSO.FileExists() как по короткому так и по полному. Если COMPROP() убрать, то только по короткому

CLEAR all
show_dir(GETDIR())
RETURN
FUNCTION show_dir(cFolder)
oFSO=CreateObject("Scripting.FileSystemObject")
loDir=oFSO.GetFolder(cFolder)
COMPROP(oFSO, "UTF8", 1)
FOR EACH loFolder IN loDir.SubFolders
LOCAL ARRAY aFile[1,5]
FOR EACH oFile IN loDir.Files
COMPROP(oFile, "UTF8", 1)
? "---------------------------------"
?(oFile.Path) + CHR(9);
+ iif(File(oFile.Path),"-НАЙДЕН!", "-не найден...")
?(oFile.ShortPath) + CHR(9);
+ iif(!EMPTY(SYS(2000,oFile.ShortPath)),"-НАЙДЕН!", "-не найден...")
?(oFile.ShortPath) + CHR(9);
+ iif(adir(aFile,oFile.ShortPath, "SH")>0,"-НАЙДЕН!", "-не найден...")
?(oFile.Path) + CHR(9);
+ iif(adir(aFile,oFile.Path, "SH")>0,"-НАЙДЕН!", "-не найден...")
?(oFile.ShortPath) + CHR(9);
+ iif(oFSO.FileExists(oFile.ShortPath),"-НАЙДЕН!", "-не найден...")
?(oFile.Path) + CHR(9);
+ iif(oFSO.FileExists(oFile.Path),"-НАЙДЕН!", "-не найден...")
ENDFOR
ENDFOR
RETURN



Исправлено 2 раз(а). Последнее : technik, 06.07.09 19:00
Ratings: 0 negative/0 positive
Re: Прочитать имя файла с Unicode-символами
Nick_nsk

Сообщений: 33
Дата регистрации: 20.10.2006
2 technik

Спасибо большое!
Файлы видны, значит доступны для переименования.

Очень помогли!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 26 (Гостей: 26)

© 2000-2024 Fox Club 
Яндекс.Метрика