Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在使用MemoryStream类时尝试替换字节_C#_Memorystream - Fatal编程技术网

C#在使用MemoryStream类时尝试替换字节

C#在使用MemoryStream类时尝试替换字节,c#,memorystream,C#,Memorystream,我从大型机获取一个文本文件,有时会在文本行的中间插入一些0x0D previos程序员使用FileStream类创建了一个方法。此方法工作正常,但遍历整个文件大约需要30分钟 我的想法是将需要的文本行(大约25行)传递给一个方法,以减少处理时间 我一直在使用MemoryStream类,但是遇到了一个问题,它没有找到0x0D控制代码 以下是当前的FileStream方法: private void ReplaceFileStream(string strInputFile) { FileS

我从大型机获取一个文本文件,有时会在文本行的中间插入一些0x0D

previos程序员使用FileStream类创建了一个方法。此方法工作正常,但遍历整个文件大约需要30分钟

我的想法是将需要的文本行(大约25行)传递给一个方法,以减少处理时间

我一直在使用MemoryStream类,但是遇到了一个问题,它没有找到
0x0D
控制代码

以下是当前的FileStream方法:

private void ReplaceFileStream(string strInputFile)
{
    FileStream fileStream = new FileStream(strInputFile, FileMode.Open, FileAccess.ReadWrite);
    byte filebyte;

    while (fileStream.Position < fileStream.Length)
    {
        filebyte = (byte)fileStream.ReadByte();
        if (filebyte == 0x0D)
        {
            filebyte = 0x20;
            fileStream.Position = fileStream.Position - 1;
            fileStream.WriteByte(filebyte);
        }
    }
    fileStream.Close();
}
private void ReplaceMemoryStream(string strInputLine)
{
    byte[] byteArray = Encoding.ASCII.GetBytes(strInputLine);
    MemoryStream fileStream = new MemoryStream(byteArray);

    byte filebyte;

    while (fileStream.Position < fileStream.Length)
    {
        filebyte = (byte)fileStream.ReadByte();
        if (filebyte == 0x0D)
        {
            filebyte = 0x20;
            fileStream.Position = fileStream.Position - 1;
            fileStream.WriteByte(filebyte);
        }
    }
    fileStream.Close();
}
private void ReplaceFileStream(字符串strInputFile)
{
FileStream FileStream=newfilestream(strInputFile,FileMode.Open,FileAccess.ReadWrite);
字节文件字节;
while(fileStream.Position
下面是MemoryStream方法:

private void ReplaceFileStream(string strInputFile)
{
    FileStream fileStream = new FileStream(strInputFile, FileMode.Open, FileAccess.ReadWrite);
    byte filebyte;

    while (fileStream.Position < fileStream.Length)
    {
        filebyte = (byte)fileStream.ReadByte();
        if (filebyte == 0x0D)
        {
            filebyte = 0x20;
            fileStream.Position = fileStream.Position - 1;
            fileStream.WriteByte(filebyte);
        }
    }
    fileStream.Close();
}
private void ReplaceMemoryStream(string strInputLine)
{
    byte[] byteArray = Encoding.ASCII.GetBytes(strInputLine);
    MemoryStream fileStream = new MemoryStream(byteArray);

    byte filebyte;

    while (fileStream.Position < fileStream.Length)
    {
        filebyte = (byte)fileStream.ReadByte();
        if (filebyte == 0x0D)
        {
            filebyte = 0x20;
            fileStream.Position = fileStream.Position - 1;
            fileStream.WriteByte(filebyte);
        }
    }
    fileStream.Close();
}
private void replaceMorystream(字符串strInputLine)
{
byte[]byteArray=Encoding.ASCII.GetBytes(strInputLine);
MemoryStream fileStream=新的MemoryStream(byteArray);
字节文件字节;
while(fileStream.Position

因为我以前没有使用过MemoryStream类,所以我对它不是很熟悉。有什么提示或想法吗?

如果您的替换代码在流中找不到
0x0D
,并且前面的FileStream方法找到了它,我认为这可能是因为您用于获取文件字节的编码,您可以尝试使用其他编码类型

否则,您的代码看起来很好,我会在MemoryStream周围使用using来确保它被关闭和释放,类似这样:

using(var fileStream = new MemoryStream(byteArray))
{

  byte filebyte;

 // your while loop...

}
private void ReplaceFileStream(string strInputFile)
{
    byte[] fileBytes = File.ReadAllBytes(strInputFile);
    bool modified = false;
    for(int i=0; i < fileBytes.Length; ++i)
    {
        if (fileByte[i] == 0x0D)
        {
            fileBytes[i] = 0x20;
            modified = true;
        }
    } 

    if (modified)
    {
        File.WriteAllBytes(strInputFile, fileBytes);
    }
}

看看你的代码,我不是100%确定你对内存流所做的更改会被持久化;事实上,我认为如果在更改后不保存它,您的更改将丢失。在这方面我可能是错的,但您应该测试一下,如果它没有保存,您应该在更改后使用StreamWriter保存它。

我不知道文件的大小,但是如果它们足够小,您可以一次将整个内容加载到内存中,那么您可以执行以下操作:

using(var fileStream = new MemoryStream(byteArray))
{

  byte filebyte;

 // your while loop...

}
private void ReplaceFileStream(string strInputFile)
{
    byte[] fileBytes = File.ReadAllBytes(strInputFile);
    bool modified = false;
    for(int i=0; i < fileBytes.Length; ++i)
    {
        if (fileByte[i] == 0x0D)
        {
            fileBytes[i] = 0x20;
            modified = true;
        }
    } 

    if (modified)
    {
        File.WriteAllBytes(strInputFile, fileBytes);
    }
}
private void ReplaceFileStream(字符串strInputFile)
{
byte[]fileBytes=File.ReadAllBytes(strInputFile);
bool-modified=false;
for(int i=0;i
如果无法一次读取整个文件,则应切换到缓冲读取类型的设置,下面是一个示例,从文件读取,写入临时文件,然后最终将临时文件复制到原始文件上。这将产生比一次读取一个字节的文件更好的性能:

private void ReplaceFileStream(string strInputFile)
{
    string tempFile = Path.GetTempFileName();
    try
    {
        using(FileStream input = new FileStream(strInputFile,
            FileMode.Open, FileAccess.Read))
        using(FileStream output = new FileStream(tempFile,
            FileMode.Create, FileAccess.Write))
       {
           byte[] buffer = new byte[4096];
           bytesRead = input.Read(buffer, 0, 4096);
           while(bytesRead > 0)
           {
                for(int i=0; i < bytesRead; ++i)
                {
                    if (buffer[i] == 0x0D)
                    {
                        buffer[i] = 0x20;
                    }
                }

                output.Write(buffer, 0, bytesRead);
                bytesRead = input.Read(buffer, 0, 4096);
            }
            output.Flush();
        }

        File.Copy(tempFile, strInputFile);
    }
    finally
    {
        if (File.Exists(tempFile))
        {
            File.Delete(tempFile);
        }
    }
}
private void ReplaceFileStream(字符串strInputFile)
{
字符串tempFile=Path.GetTempFileName();
尝试
{
使用(FileStream输入=新的FileStream(strInputFile,
FileMode.Open,FileAccess.Read)
使用(FileStream output=newfilestream(tempFile,
FileMode.Create,FileAccess.Write)
{
字节[]缓冲区=新字节[4096];
bytesRead=input.Read(缓冲区,04096);
而(字节读取>0)
{
for(int i=0;i
找不到,或者没有编写更改?您基本上是在修改内存中的字节数组。您的代码不会将更改写回磁盘。事实上,MemoryStream在代码中是完全多余的——您也可以在字节数组上迭代并修改它。然后使用File.writealBytes将其保存回磁盘。我很好奇为什么不执行strInputLine.Replace('\x000D','')之类的操作,然后写入该行。也许我错过了什么?或者不管对应的角色是什么来代替十六进制…你可以转义和替换控制角色。肯特-从来没有找到它贾斯汀和奥斯汀-良好的团队合作装备-以为我尝试了一切,但不记得尝试过。使用“\r”时,认为它将是相同的,但从未找到它。我100%确定它们不会在任何地方持久化。我也是,但除非选中,否则决不会说“永不”,我现在没有时间亲自调试此类代码段;-)我能够使用第一个代码段将文件加载到内存中。这将处理时间从47分钟减少到5秒。事实上,我已经运行了好几次测试,因为我不敢相信会有这么大的时差。当您以缓冲方式读取文件时,而不是一次读取一个字节时,会有很大的时差。对于第一个代码段,您将整个文件作为一个块来读取,因此速度应该快得多。请记住,如果文件非常大,您可能需要使用第二个代码段,因为加载整个f