【问题标题】:C# Append byte array to existing fileC#将字节数组附加到现有文件
【发布时间】:2011-10-15 07:08:05
【问题描述】:

我想将一个字节数组附加到一个已经存在的文件(C:\test.exe)。假设如下字节数组:

byte[] appendMe = new byte[ 1000 ] ;

File.AppendAllBytes(@"C:\test.exe", appendMe); // Something like this - Yes, I know this method does not really exist.

我会使用 File.WriteAllBytes 来执行此操作,但我将使用一个 ENORMOUS 字节数组,并且 System.MemoryOverload 异常会不断被抛出。所以,我很可能不得不将大数组分成几块,并将每个字节数组附加到文件的末尾。

谢谢,

埃文

【问题讨论】:

  • 我不明白这个问题。
  • 我的主要目标是将两个巨大的字节数组加在一起。但是,这是不可能的,因为会引发异常(内存不足)。因此,我的解决方案是将每个字节数组分别写入一个输出文件(而不是将它们组合起来并将它们作为一个写入文件)。
  • 您至少应该提供一些您已经尝试过的代码......到目前为止,还不清楚是什么导致了您的问题 - 所有 Stream 和 Writer 类都能够直接写入字节数组。
  • “将字节数组附加到已经存在的文件”有什么难理解的?其他人似乎都明白了……

标签: c# arrays byte append concatenation


【解决方案1】:

您可以简单地创建一个函数来执行此操作

public static void AppendToFile(string fileToWrite, byte[] DT)
{
    using (FileStream FS = new FileStream(fileToWrite, File.Exists(fileToWrite) ? FileMode.Append : FileMode.OpenOrCreate, FileAccess.Write)) {
        FS.Write(DT, 0, DT.Length);
        FS.Close();
    }
}

【讨论】:

  • 使用{}不需要调用FS.Close();
【解决方案2】:

您也可以使用内置的FileSystem.WriteAllBytes Method (String, Byte[], Boolean)

public static void WriteAllBytes(
    string file,
    byte[] data,
    bool append
)

将 append 设置为 True 以追加到文件内容; False 覆盖文件内容。默认为 False。

【讨论】:

【解决方案3】:

我不确定问题是什么,但 C# 有一个 BinaryWriter 方法,它接受一个字节数组。

BinaryWriter(Byte[])

bool writeFinished = false;
string fileName = "C:\\test.exe";
FileStream fs = new FileString(fileName);
BinaryWriter bw = new BinaryWriter(fs);
int pos = fs.Length;
while(!writeFinished)
{
   byte[] data = GetData();
   bw.Write(data, pos, data.Length);
   pos += data.Length;
}

其中writeFinished 在所有数据都已追加后为真,GetData() 返回要追加的数据数组。

【讨论】:

    【解决方案4】:

    一种方法是使用FileMode.Append 创建模式创建FileStream

    如果文件存在则打开文件并查找文件末尾,或者 创建一个新文件。

    这看起来像:

    public static void AppendAllBytes(string path, byte[] bytes)
    {
        //argument-checking here.
    
        using (var stream = new FileStream(path, FileMode.Append))
        {
            stream.Write(bytes, 0, bytes.Length);
        }
    }
    

    【讨论】:

    • 这看起来很完美。其他一些答案使用 BinaryWriter;为什么要选择这个而不是 FileStream 方法?我猜它执行完全相同的功能,但需要更多的代码行。
    • 需要冲洗吗?
    • @JohnDemetriou 从 using 语句中退出块后,将调用 Close(),然后调用 Flush();所以我认为你不需要调用 Flush()
    【解决方案5】:
    1. 创建一个新的FileStream
    2. Seek() 到最后。
    3. Write() 字节。
    4. Close() 直播。

    【讨论】:

    • 这似乎是我的问题的最佳解决方案。我会试一试,让你知道。谢谢
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 2015-12-10
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多