Полезная информация

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№117-02-2014 19:29:30

Iczer
Участник
 
Группа: Members
Зарегистрирован: 25-08-2007
Сообщений: 63
UA: Firefox 10.0

nsILocalFile.create - поддержка юникода?

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

Выделить код

Код:

var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(destinationfullpath);
if( !file.exists() || !file.isFile() ) { file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644) };
var fileURI = ioService.newFileURI(file);

код работает нормально, если кодировка имени файла английская или совпадает с кодовой страницей ОС. В противном случае (имя файла в юникоде) подучаю ошибку:

Выделить код

Код:

[Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsILocalFile.create]"  nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)

Как обойти эту ошибку и таки создать файл?

Отсутствует

 

№217-02-2014 21:38:00

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 27.0

Re: nsILocalFile.create - поддержка юникода?

Какой путь-то?
Я сейчас вот такое проверил:

Выделить код

Код:

var path = "D:\\æƠɫφՔẲ㋻㍼";
var file = Components.classes["@mozilla.org/file/local;1"]
    .createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(path);
file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644);

Работает.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№317-02-2014 22:23:30

Iczer
Участник
 
Группа: Members
Зарегистрирован: 25-08-2007
Сообщений: 63
UA: Firefox 10.0

Re: nsILocalFile.create - поддержка юникода?

Сохраняю в темп

Выделить код

Код:

var destinationfullpath = "C:\\temp\\"+unescape("いくつかのファイル名.pdf")

Отсутствует

 

№417-02-2014 23:18:59

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 27.0

Re: nsILocalFile.create - поддержка юникода?

Такое у меня тоже работает, в том числе и в Firefox 10.0.11.
Возможно, от операционной системы зависит.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№518-02-2014 20:04:14

Iczer
Участник
 
Группа: Members
Зарегистрирован: 25-08-2007
Сообщений: 63
UA: Firefox 10.0

Re: nsILocalFile.create - поддержка юникода?

Хмм... А файл создаётся?
Добавил два алерт-а - до и после создания файла. Первый появляется (но имя файла пишет знаками вопроса - может в этом проблема?), а второй нет - сразу срабатывает алерт из последней строки - ловит ошибку.
Специально кодировку имени файла я никак не обозначал - скорее всего она получается UTF-16 Little Endian.

Выделить код

Код:

try {'

var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(destinationfullpath);

alert(destinationfullpath);

file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644);

alert(destinationfullpath);

 }catch(e){alert(e);}'

-------
Уря! :) Сконвертировал имя файла в UTF-8 и всё заработало!

Отредактировано Iczer (18-02-2014 20:13:44)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]