2011-07-28 36 views
29

Tôi muốn nối thêm một mảng byte vào một tệp đã tồn tại (C:\test.exe). Giả sử mảng byte sau:C# Nối mảng byte vào tập tin hiện có

byte[] appendMe = new byte[ 1000 ] ; 

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

tôi sẽ làm bằng này File.WriteAllBytes, nhưng tôi sẽ sử dụng một mảng byte KHỔNG LỒ, và System.MemoryOverload ngoại lệ được liên tục được ném. Vì vậy, tôi rất có thể sẽ phải chia mảng lớn thành từng phần và nối thêm mỗi mảng byte vào cuối tệp.

Cảm ơn bạn,

Evan

+0

Tôi không hiểu vấn đề. –

+0

Mục tiêu chính của tôi là thêm hai mảng byte khổng lồ với nhau. Điều này là không thể, tuy nhiên, như một ngoại lệ (hết bộ nhớ) được ném. Vì vậy, giải pháp của tôi là viết từng mảng byte vào một tệp đầu ra riêng biệt, (trái ngược với việc kết hợp chúng và ghi chúng vào tệp dưới dạng tệp). –

+0

Bạn nên ít nhất cung cấp một số mã mà bạn đã thử ... Cho đến nay vẫn chưa rõ nguyên nhân gây ra vấn đề của bạn - tất cả các lớp Stream và Writer đều có thể ghi trực tiếp các mảng byte. –

Trả lời

47

Một cách là tạo FileStream với chế độ tạo FileMode.Append.

Mở tệp nếu nó tồn tại và tìm đến cuối tệp hoặc tạo tệp mới.

này sẽ giống như thế:

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); 
    } 
} 
+0

Điều này hoạt động hoàn hảo - cảm ơn bạn –

+1

Điều này có vẻ hoàn hảo. Một số câu trả lời khác sử dụng BinaryWriter; tại sao một trong những lựa chọn này trên phương pháp FileStream? Tôi đoán nó thực hiện chính xác chức năng tương tự, nhưng có nhiều dòng mã hơn. – radsdau

+1

hiện nó cần tuôn ra? –

3

Tôi không chắc chắn chính xác những gì các câu hỏi là, nhưng C# có một phương pháp BinaryWriter mà phải mất một mảng byte.

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; 
} 

đâu writeFinished là đúng khi tất cả các dữ liệu đã được nối, và GetData() trả về một mảng dữ liệu được nối.

6
  1. Tạo mới FileStream.
  2. Seek() cho đến cuối.
  3. Write() các byte.
  4. Close() luồng.
+0

Điều này có vẻ là giải pháp tốt nhất cho vấn đề của tôi. Tôi sẽ cung cấp cho nó một đi và cho bạn biết. Cảm ơn –

5

Bạn cũng có thể sử dụng được xây dựng trong FileSystem.WriteAllBytes Method (String, Byte[], Boolean).

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

Set thêm để Đúng để phụ thêm vào nội dung tập tin; False để ghi đè nội dung tệp. Mặc định là Sai.

+1

Theo như tôi có thể nói đây là giải pháp duy nhất của VB.Net. https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.filesystem.writeallbytes(v=vs.110).aspx –

0

bạn chỉ có thể tạo ra một chức năng để làm điều này

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(); 
    } 
} 
+1

sử dụng {} không cần gọi 'FS.Close();' – GSP

Các vấn đề liên quan