为什么我可以使用FileSystemObjects来读取和编写客户端二进制文件,而不是用于读取和发送它们到服务器?

时间:2012-05-23 22:42:31

标签: c# javascript vbscript binary-data filesystemobject

我按以下方式创建了一个二进制文件(以确保所有可能的字节值都在二进制文件中):

using (var fs = File.Create(fileName))
{
    for (byte b = 0; b < Byte.MaxValue; b++)
    {
        fs.WriteByte(b);
    }
}

我以这种方式阅读它(用于测试它是否有效):

using (var fs = File.Open(fileName, FileMode.Open))
{
    long oldPos = -1;
    long pos = 0;
    while (oldPos != pos)
    {
        oldPos = pos;
        Console.WriteLine(Convert.ToString(fs.ReadByte(), 2).PadLeft(8, '0'));
        pos = fs.Position;
    } 
}

在IE中的javascript中,复制文件(读取它,然后将其写回)在使用FileSystemObject时工作得很好:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var from = fso.OpenTextFile(fileToRead, 1, 0); // read, ASCII (-1 for unicode)
var to = fso.CreateTextFile(fileToWriteTo, true, false); 
while (!from.AtEndOfStream) {
    to.Write(from.Read(1));
}
from.Close();
to.Close();

当我读取输出的二进制文件时,我得到00000000,00000001,00000010 ......等。

但是尝试将其读入javascript似乎会导致无法阅读:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var from = fso.OpenTextFile(fileToRead, 1, 0); 
var test = [];
while (!from.AtEndOfStream) {
    test.push(0xff & from.Read(1));  // make it a byte.
}
from.Close();

导致测试在其数组中有一堆0,以及其他一些非零项目,但大多只是0。

有人可以解释为什么它适用于一个而不是另一个?我需要做什么才能将值转换为javascript?

顺便说一句,here is a related read on reading files off the client machine

1 个答案:

答案 0 :(得分:0)

首先,您知道最终数组的长度是否与文件的长度相同?

在单独的操作中尝试阅读和“推送”,例如:

...  
Test2 = from.Read(1));  
// Possibly display value of Test2 as string  
test.push(Test2);  
...  

此外,您可以尝试使用文本数据来查看是否是导致问题的文件/数据的二进制特性。