2009-08-26 4 views
0

Ich arbeite an einem Projekt (BrowserIO - gehe zu browserio dot googlecode dot com, wenn Sie den Code auschecken und daran arbeiten. Hilfe Willkommen!), In dem ich bin Verwenden von Firefox's nsIFileInputStream zusammen mit nsIConverterInputStream, gemäß ihrem Beispiel(), aber nur ein Teil der vollständigen Daten wird geladen. Der Code ist:Loaded Daten abgeschnitten, wenn nsIFileInputStream & nsIConverterInputStream

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

var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); 
var cstream = Components.classes["@mozilla.org/intl/converter-input-stream;1"].createInstance(Components.interfaces.nsIConverterInputStream); 

fstream.init(file, -1, 0, 0); 
cstream.init(fstream, "UTF-8", 0, 0); // you can use another encoding here if you wish 

var str = {}; 
cstream.readString(-1, str); // read the whole file and put it in str.value 
data = str.value; 

cstream.close(); // this closes fstream 

Wenn Sie dieses Verhalten sehen mögen, den Code aus der BrowserIO Projektseite Kasse und Firebug verwenden, um einen Haltepunkt an der data = str.value; Linie in file_io.js einzustellen. Wählen Sie dann eine Textdatei aus der Liste und klicken Sie auf die Schaltfläche "Öffnen". Stellen Sie in Firebug im Uhrfenster eine Uhr für str.value ein. Schau dir die Datei an ... Sie sollte abgeschnitten sein, es sei denn, sie ist wirklich kurz.

Als Referenz ist der obige Code der Hauptteil der Funktion openFile() in trunk/scripts/file_io.js.

Jeder hat eine Ahnung, was passiert mit diesem?

Antwort

2

Siehe nsIConverterInputStream; im Grunde bedeutet -1 nicht "gib mir alles", sondern "gib mir den Standardbetrag", was die Dokumentinformation 8192 lautet.

Allgemeiner, wenn du den Inhalt eines Eingabestroms erschöpfen willst, du muss schleifen, bis es leer ist. Nichts in einem der Stream-Verträge garantiert, dass die Menge der von einem Aufruf zurückgegebenen Daten die Gesamtheit des Inhalts des Streams ist; es könnte sogar weniger zurückgeben als es sofort verfügbar hat, wenn es gewünscht wird.

+0

Ja, ich herausgefunden, nachdem ich um ein wenig mit ihm durcheinander. Das andere Problem, das ich jetzt habe, ist, dass wenn ich den Inhalt durch den Konverter-Stream übergebe, ich den Dateicodierungstyp im Voraus wissen muss. So habe ich zum Beispiel zwei Dateien: Eine in UTF-8 und die andere in Latin-1 (ISO-8859-1). Wenn ich die Codierung festlege, funktioniert es nur für einen Dateityp. Kennen Sie eine Möglichkeit, direkt auf die Daten aus dem fstream-Objekt/nsIFileInputStream zuzugreifen? Browser die MDC-Dokumente jetzt, nicht viel zu finden ... –

+0

Ihre Idee unten funktioniert, aber der gewünschte Wert ist keine Zeichenfolge; es ist wirklich angemessener ein Array von Bytes. Letzteres zu erhalten ist einfach genug und erfordert nur nsIBinaryInputStream anstelle von nsIScriptableStream. Beachten Sie jedoch, dass nsIScriptableInputStream.read unter der Haube ein char * zurückgibt; Was ist, wenn die Datei null Bytes enthält? Der C++ -> JS-Code hat keine Möglichkeit zu wissen, dass das zurückgegebene char * eine Länge hat, die größer ist, als strlen anzeigen würde. Daher erhalten Sie abgeschnittene Strings, wenn Ihre Datei Nullen enthält. Es spielt vielleicht keine Rolle, aber es spielt mit Feuer in meinem Buch, und ich würde es vermeiden. –

0

Ich entdeckte, wie man die Datei liest, ohne zu konvertieren, um Probleme zu vermeiden, die Dateicodierungstyp nicht zu kennen. Die Antwort ist, verwenden nsIScriptableInputStream mit nsIFileInputStream:

var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); 
fstream.init(file, 0x01, 0004, 0); 
sstream.init(fstream); 
data = sstream.read(sstream.available()); 
+0

Aus der Dokumentation: "Hinweis: Diese Methode (available()) sollte nicht verwendet werden, um die Gesamtgröße eines Streams zu bestimmen, auch wenn der Stream einer lokalen Datei entspricht. Außerdem kann ein Stream mehr als 2^zur Verfügung stellen 32 Byte Daten, diese Methode ist nicht in der Lage, die gesamte Größe der zugrunde liegenden Datenquelle auszudrücken. " https://developer.mozilla.org/de/XPCOM_Interface_Reference/nsIScriptableInputStream#available() – makdad

Verwandte Themen