Страницы: 1
Суть такая: я скачаваю с удаленного сервера несколько файлов и сохраняю их во временной папке. Затем, мне нужно прочитать эти файлы и получить их содержимое для последующей обработки.
Проблема в том, что при выполнении метода main, файл не успевает сохраниться к моменту, когда его пытается прочитать функция getFileSource().
Можно ли, как-то, приостановить выполнение дальнейших конструкций, пока файл не будет полностью получен и сохранен?
Вот примерный скрипт:
var obj = { main : function () { var url1 = 'http://site.ru/image1.jpg'; var url2 = 'http://site.ru/image2.jpg'; var result = true; var file1 = null; if (url1) { file1 = this.downloadFile(url1, 'image1.jpg'); } var file2 = null; if (url2) { file2 = this.downloadFile(url2, 'image2.jpg'); } if (result) { var fileData = ''; var fileName = 'data.txt'; if (file1) fileData += this.getFileSource(file1, 1); fileData += '-----'; if (file2) fileData += this.getFileSource(file2, 1); alert(fileData); } }, downloadFile : function (url, fileName) { var ios = Components.classes['@mozilla.org/network/io-service;1'] .createInstance(Components.interfaces.nsIIOService); var getFile = ios.newURI(url, null, null); var newFile = Components.classes['@mozilla.org/file/local;1'] .createInstance(Components.interfaces.nsILocalFile); var tmp = Components.classes['@mozilla.org/file/directory_service;1'] .createInstance(Components.interfaces.nsIProperties) .get('TmpD', Components.interfaces.nsIFile); newFile.initWithPath(tmp.path); newFile.appendRelativePath(fileName); if(!newFile.exists()) newFile.create(0x00, 0666); var wbp = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] .createInstance(Components.interfaces.nsIWebBrowserPersist); wbp.saveURI(getFile, null, null, null, null, newFile); return newFile; }, getFileSource : function (file, onDelete) { var fis = Components.classes['@mozilla.org/network/file-input-stream;1'] .createInstance(Components.interfaces.nsIFileInputStream); var bis = Components.classes['@mozilla.org/binaryinputstream;1'] .createInstance(Components.interfaces.nsIBinaryInputStream); fis.init(file, 0x01, 0444, 0); bis.setInputStream(fis); var data = bis.readBytes(file.fileSize); bis.close(); fis.close(); if (onDelete) { file.remove(0); } return data; } }
Отсутствует
У nsIWebBrowserPersist есть поле nsIWebProgressListener progressListener
То есть, на wbp можно повесить listener
Думаю, может помочь.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Переместить код из main в нужный метод listener'а. Пусть listener по окончании загрузки вызывает getFileSource.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
При попытке прочитать файл с помощью getFileSource выдает ошибку:
Ошибка: uncaught exception: [Exception... "Component returned failure code: 0x80520015 (NS_ERROR_FILE_ACCESS_DENIED) [nsIBinaryInputStream.readBytes]" nsresult: "0x80520015 (NS_ERROR_FILE_ACCESS_DENIED)" location: "JS frame :: chrome://myext/content/myext.js :: anonymous :: line 417" data: no]
Возможно, нужно как-то разблокировать файл? В документации по этому поводу ничего не нашел.
Отредактировано Cristian (13-12-2008 15:27:14)
Отсутствует
При попытке прочитать файл с помощью getFileSource выдает ошибку:
Рискну предположить, что это для второго url, файл для которого не создаётся.
Поэкспериментировал - nsIWebProgressListener в этом случае не помогает.
Вот ещё есть такая идея: http://pastebin.mozilla-russia.org/93590
Хотя, по-моему, должна быть и другая, более правильная.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Не нашел более подходящей темы, но чтобы не плодить линее, решил запостить тут:
Почему-то на каком-то этапе FF перестал читать данные из файла скриптом.
Сейчас у меня вылетает ошибка
[object XrayWrapper [object Window]]
Если использовать код, подскажите как победить эту напасть, нужно данные из файла прочитать скриптом и в переменную загнать.
function toUnicode(charset, data){ var uniConv = Components.classes['@mozilla.org/intl/scriptableunicodeconverter']; uniConv = uniConv.createInstance(Components.interfaces.nsIScriptableUnicodeConverter); uniConv.charset = charset; data = uniConv.ConvertToUnicode(data); return data; }; var conv = Components.classes["@mozilla.org/network/protocol;1?name=file"]; conv = conv.createInstance(Components.interfaces.nsIFileProtocolHandler); var url ="file:\\\D:\\file.txt"; var file = conv.getFileFromURLSpec(url); var file_size=file.fileSize; var stream; stream = Components.classes["@mozilla.org/network/file-input-stream;1"]; stream = stream.createInstance(Components.interfaces.nsIFileInputStream); stream.init(file, 1, 0,0); var s2 = Components.classes["@mozilla.org/scriptableinputstream;1"]; s2 = s2.createInstance(Components.interfaces.nsIScriptableInputStream); s2.init(stream); var content = null; content = s2.read(file_size); stream.close(); str=toUnicode("windows-1251",content.toString()); alert(str);
Отредактировано lostandleft1 (16-06-2013 16:25:31)
Отсутствует
Не нашел более подходящей темы, но чтобы не плодить линее, решил запостить тут:
Почему-то на каком-то этапе FF перестал читать данные из файла скриптом.
Сейчас у меня вылетает ошибка[object XrayWrapper [object Window]]
Если использовать код, подскажите как победить эту напасть, нужно данные из файла прочитать скриптом и в переменную загнать.
...
lostandleft1, та же проблема, ты случаем не нашел как ее решить?
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует
Страницы: 1