Доступ к файлу содержащий символы юникода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 20.12.2008 (Сб) 23:15

Долго искал по форуму, но так и не смог найти ответ на свой вопрос.

В общем нужно открыть файл (желательно средствами ВБ, т.е. командой open) содержащий символы юникода.
При попытке открыть через диалоговое окно или через OLEDragDrop получаю чтото наподобии такого:
C:\Я идиот! Убейте меня, кто-нибудь!? ????.txt
и само собой что открыть такой файл не представляется возможным. Воопщем надоб както открыть его. Сразу скажу, что само имя файла мне не важно, главное открыть его.
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Доступ к файлу содержащий символы юникода

Сообщение SLIM » 20.12.2008 (Сб) 23:42

Megas13 писал(а):В общем нужно открыть файл (желательно средствами ВБ, т.е. командой open) содержащий символы юникода.

неверно сформулированный вопрос я так понял? Содержит это значит внутри символы Unicode...а у тебя видимо символы Unicode в названии\пути файла
И почему такой файл открыть не получается? Что в итоге то? Ошибки, и ли еще что-то? Что сделано то?
Пишите жизнь на чистовик.....переписать не удастся.....

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 21.12.2008 (Вс) 0:25

Извиняюсь если объяснился не совсем точно.
Да, речь идет о юникод символах в названии файла или в пути к файлу.

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

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 21.12.2008 (Вс) 0:33

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

Код: Выделить всё
Private Sub Form1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim i As Long, file_n As String
     
    If Data.GetFormat(vbCFFiles) Then
        For i = 1 To Data.Files.Count
            file_n = Data.Files(i)
            Open file_n For Binary As #1  '<=== тут возникает ошибка
            'Тут делаем чтото с файлом
            Close 1
        Next
    End If
End Sub
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Доступ к файлу содержащий символы юникода

Сообщение SLIM » 21.12.2008 (Вс) 0:45

FSO пробовал? Он должен нормально работать с Unicode
Пишите жизнь на чистовик.....переписать не удастся.....

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 21.12.2008 (Вс) 6:46

Есть вероятность, что уже DataObject не понимает Юникод, тогда FSO не поможет.
Изображение

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 21.12.2008 (Вс) 11:48

SLIM писал(а):FSO пробовал? Он должен нормально работать с Unicode

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

Думал покапать в двух направлениях:
1) Попробовать както поиграться с указателям на строчку содержащую название файла и с прямыим чтением из памяти. Но с этим слишком мало опыта, поэтому не знаю с чего начать. Вот и спрашиваю тут, может кто знает.
2) Есть API функция которая конвертирует длинные/юникодные имена файлов в винде в короткие имена "аля DOS" (название функции не помню, но найти её не проблема). Но тут опять же проблема в том, что и этой функции надо передать корректное длинное имя файла.
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Доступ к файлу содержащий символы юникода

Сообщение SLIM » 21.12.2008 (Вс) 13:04

Вообще если не ошибаюсь, то имена файлов в ОС хранятся в формате Unicode в любом случае.
Поэтому может воспользоваться API перекодировкой? Тут опять таки если не ошибаюсь, на винде должна быть установлена нужная кодовая страница.
Нет просто сейчас возможности попробовать, так что может у тебя быстрее получится.....
Пишите жизнь на чистовик.....переписать не удастся.....

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 21.12.2008 (Вс) 17:55

tyomitch писал(а):Есть вероятность, что уже DataObject не понимает Юникод, тогда FSO не поможет.

Подтверждаю, что так и есть: в Data.Files(i) лежат уже вопросики вместо символов вне ACP.
Т.е. нужно искать не альтернативный механизм работы с файлами, а альтернативный механизм работы с OLE Drop.
FSO совершенно не в тему.
Изображение

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 21.12.2008 (Вс) 17:56

SLIM писал(а):Поэтому может воспользоваться API перекодировкой?

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

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 21.12.2008 (Вс) 17:58

tyomitch писал(а):Т.е. нужно искать не альтернативный механизм работы с файлами, а альтернативный механизм работы с OLE Drop.

Проблема ещё усугубляется тем, что программа открывает файлы не только посредством OLE Drop, но и через Common Dialog и через коммандную строку. И во всех случаях появляются вопросики вместо юникодных символов.
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 21.12.2008 (Вс) 18:15

Megas13 писал(а):
tyomitch писал(а):Т.е. нужно искать не альтернативный механизм работы с файлами, а альтернативный механизм работы с OLE Drop.

Проблема ещё усугубляется тем, что программа открывает файлы не только посредством OLE Drop, но и через Common Dialog и через коммандную строку. И во всех случаях появляются вопросики вместо юникодных символов.

Значит, проблема и в DataObject, и в работе с файлами оператором Open.
Common Dialog, если вызывать через API GetOpenFileNameW, позволит получить юникодное имя; бросаемый на форму контрол -- скорее всего нет.
Юникодную командную строку тоже можно прочитать через API GetCommandLineW, не рассчитывая на поддержку юникода в Command$.
Только OLE Drop я сходу не скажу как сделать юникодно.
Изображение

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 21.12.2008 (Вс) 19:57

tyomitch
Большое спасибо за GetCommandLineW, наконецто хоть какойто сдвиг. После небольшого шаманства получилось извлеч путь к файлу из коммандной строки. Однако как оказалось команда open наотрез отказывается открывать такой файл, при этом не выдавая ниодной ошибки. Тогда я решил воспользоваться функцией GetShortPathNameW для получение короткого пути к файлу без юникода. К моему удивлению и это не помогло. Протрасировал работу программы с помощью File Monitor и обнаружил, что комманда открытия файла в итоге всёравно переводит путь в длинный вариант. А не сумев открыть такой файл создает пустой файл в папке C:\Documents and Settings\UserName\
Вот такие вот пироги. Придется значит и с файлом работать посредством API. :(

Кстати Common Dialog использую API-вский, но там используется GetOpenFileNameA заместо GetOpenFileNameW. Потом переделаю и отпишу, что получилось.

Будет вообще здорово, если найдется решение и для OLE Drop.
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Доступ к файлу содержащий символы юникода

Сообщение Хакер » 21.12.2008 (Вс) 20:29

А куда делся мой ответ про RegisterDragDrop и IDropTarget?

Megas13, смотри здесь и тут.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 21.12.2008 (Вс) 21:23

Megas13 писал(а):Вот такие вот пироги. Придется значит и с файлом работать посредством API. :(

А вот и не придётся. FSO же понимает Юникод.


Хакер писал(а):А куда делся мой ответ про RegisterDragDrop и IDropTarget?

К кому этот вопрос?
У кого админ форума спрашивает об форумных глюках? ;-)
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Доступ к файлу содержащий символы юникода

Сообщение Хакер » 21.12.2008 (Вс) 21:39

Я не о глюках, а о модераторах. Вдруг кто-то снёс по каким-то причинам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 21.12.2008 (Вс) 21:41

Хакер писал(а):Я не о глюках, а о модераторах. Вдруг кто-то снёс по каким-то причинам.

В модлоге нету. Может такое быть, что снесли и в логе не отразилось?
Если нет, остаётся только винить глюки.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Доступ к файлу содержащий символы юникода

Сообщение Хакер » 21.12.2008 (Вс) 22:03

Вряд ли, но теоретически могло, если удаляющий сделал запрос и тут же разорвал соединение.

Но я скорее сам непрожал кнопку "Отправить". А вопрос задал не только с целью собственно спросить, а также чтобы показать своё как-бы негодование по поводу того, что был написан относительно большой пост, но по каким-то причинам его запощивание обломалось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 21.12.2008 (Вс) 22:09

Хакер писал(а):Вряд ли, но теоретически могло, если удаляющий сделал запрос и тут же разорвал соединение.

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

Хакер писал(а):Но я скорее сам непрожал кнопку "Отправить". А вопрос задал не только с целью собственно спросить, а также чтобы показать своё как-бы негодование по поводу того, что был написан относительно большой пост, но по каким-то причинам его запощивание обломалось.

Понятно. Соболезнуем.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Доступ к файлу содержащий символы юникода

Сообщение Хакер » 21.12.2008 (Вс) 22:18

В mysql транзакции бывают, но с таблицами, имеющими тип MyISAM, операции совершаются сразу же, и откат транзакции такие изменения не отменит. А phpbb3 использует именно этот тип таблиц.

Ладно, заканчиваем оффтопик.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 22.12.2008 (Пн) 20:20

В общем разобрался с открытием файлов средствами ВБ. Оказалось чтоб открыть такой файл командой open, надо сначала пропустить имя файла через функцию GetShortPathNameW, а затем её результат сконвертировать обратно в ANSI (что я не делал вначале). И только тогда можно свободно работать с таким файлом.

Кстати, FSO отказался открывать файл в юникоде также как и команда open.

И раз уж вы тут немного поофтопили, то таблицы типа MyISAM действительно не поддерживают транзакции.
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 22.12.2008 (Пн) 20:57

Megas13 писал(а):Кстати, FSO отказался открывать файл в юникоде также как и команда open.

Мой согласился.
Покажи свой код.
Изображение

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 23.12.2008 (Вт) 0:45

tyomitch
Прикрепил к сообщению пример кода.

Как запускать:
- Компилируем прогу
- Запускаем с указанием в аргументе пути к какому нибудь файлу с юникодными символами в пути (самый простой способ - это просто "дропнуть" этот файл на программу в эксплорере).
- Жмем кнопку "Press me"
- Перед тем как открыть файл, появится меседжбокс который отобразит путь к файлу (сделано на случай проверки, что путь файла был корректно выдран из коммандной строки)
- Затем программа попробует открыть файл и считать из него 50 символов.

На моей системе выскакивает ошибка, что файл не найден.
Вложения
Example.rar
(1.51 Кб) Скачиваний: 39
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 23.12.2008 (Вт) 0:56

Megas13 писал(а):Прикрепил к сообщению пример кода.

fixed for great justice
Вложения
Form1.zip
(1.08 Кб) Скачиваний: 36
Изображение

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 23.12.2008 (Вт) 1:08

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 23.12.2008 (Вт) 1:42

Megas13 писал(а):Хм... не понятно, но здорово :D

У тебя был лишний конверт в Юникод.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Доступ к файлу содержащий символы юникода

Сообщение tyomitch » 23.12.2008 (Вт) 1:53

Кстати, всю конструкцию из lstrlenW+ReDim+CopyMemory можно заменить одним вызовом SysAllocString
Изображение

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: Доступ к файлу содержащий символы юникода

Сообщение Megas13 » 25.12.2008 (Чт) 21:10

tyomitch писал(а):Кстати, всю конструкцию из lstrlenW+ReDim+CopyMemory можно заменить одним вызовом SysAllocString

Когда отдельно тестировал эту функцию, то всё работало как надо. Но когда перенес код в программу, то всё пошло наперекосяк. В общем я запутался в этих конвертациях строк в итоге плюнул на всё это и поэтому оставил как есть конструкцию из lstrlenW+ReDim+CopyMemory. В принципе не критично.

Хакер писал(а):А куда делся мой ответ про RegisterDragDrop и IDropTarget?

Нормальной инфы на то как это использовать в ВБ так и не нашел, но зато нашел WM_DROPFILES и DragQueryFileW. Всё работает отлично и без сбоев.

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 91

    TopList