2016-04-16 15 views
5

Làm cách nào để tạo tệp .csv ngầm/tự động bằng cách sử dụng đúng phương pháp, thêm văn bản vào tệp đó trong bộ nhớ và sau đó chuyển sang bộ nhớ dữ liệu vào một mảng byte?Tạo và ghi vào tệp văn bản inmemory và chuyển đổi thành mảng byte trong một lần

string path = @"C:\test.txt"; 
File.WriteAllLines(path, GetLines()); 
byte[] bytes = System.IO.File.ReadAllBytes(path); 

Với cách tiếp cận mà tôi tạo ra một tập tin luôn (tốt), viết vào nó (tốt) sau đó đóng nó (xấu) sau đó mở lại tập tin từ một đường dẫn và đọc nó từ đĩa cứng (xấu)

Làm cách nào để cải thiện điều đó?

CẬP NHẬT

Một cách tiếp cận gần tốt sẽ là:

using (var fs = new FileStream(@"C:\test.csv", FileMode.Create, FileAccess.ReadWrite)) 
      { 

       using (var memoryStream = new MemoryStream()) 
       { 

        fs.CopyTo(memoryStream); 
        return memoryStream .ToArray(); 
       } 

     } 

nhưng tôi không thể viết văn bản vào FileStream rằng ... chỉ byte ...

UPDATE 2

using (var fs = File.Create(@"C:\temp\test.csv")) 
      { 
       using (var sw = new StreamWriter(fs, Encoding.Default)) 
       { 
        using (var ms = new MemoryStream()) 
        { 
         String message = "Message is the correct ääüö Pi(\u03a0), and Sigma (\u03a3)."; 
         sw.Write(message); 
         sw.Flush(); 
         fs.CopyTo(ms); 
         return ms.ToArray(); 
        } 
       } 
      } 

Thông báo chuỗi không được lưu vào tệp test.csv. Có ai biết tại sao không?

Trả lời

5

Viết văn bản vào Luồng bộ nhớ.

byte[] bytes = null; 
using (var ms = new MemoryStream()) 
{ 
    TextWriter tw = new StreamWriter(ms); 
    tw.Write("blabla"); 
    tw.Flush(); 
    ms.Position = 0; 
    bytes = ms.ToArray(); 
    //or save to disk using FileStream (fs) 
    ms.WriteTo(fs); 
} 

CẬP NHẬT

Sử dụng tập tin dòng trực tiếp

using (var fs = new FileStream(@"C:\sh\test.csv", FileMode.Create, FileAccess.ReadWrite)) 
{ 
    TextWriter tw = new StreamWriter(fs); 
    tw.Write("blabla"); 
    tw.Flush(); 
} 
+0

làm thế nào để bạn vượt qua TextWriter cho FileStream? Tạo một FileStream bạn không thể vượt qua điều đó. – HelloWorld

+0

TextWriter chấp nhận luồng là đầu vào để bạn có thể sử dụng trực tiếp FileStream trên đó. – Xilmiki

+0

Tôi nghĩ rằng bạn hiểu sai câu hỏi ban đầu của mình. Tôi không chỉ muốn tạo ra một tập tin văn bản ... xin vui lòng xem xét cũng byte [] với dữ liệu "văn bản" tôi muốn. – HelloWorld

5

Bạn có thể có được một mảng byte từ một chuỗi sử dụng mã hóa:

Encoding.ASCII.GetBytes(aString); 

Hoặc

Encoding.UTF8.GetBytes(aString); 

Nhưng tôi không biết tại sao bạn muốn một csv dưới dạng byte. Bạn có thể tải toàn bộ tập tin vào một chuỗi, thêm vào nó và sau đó lưu nó:

string content; 

using (var reader = new StreamReader(filename)) 
{ 
    content = reader.ReadToEnd(); 
} 

content += "x,y,z"; 

using (var writer = new StreamWriter(filename)) 
{ 
    writer.Write(content); 
} 

Cập nhật: Tạo một csv trong bộ nhớ và vượt qua trở lại như byte:

using (var sb = new StringBuilder()) 
{ 
    foreach (string line in GetLines()) 
     sb.AppendLine(line); 

    return Encoding.ASCII.GetBytes(sb.ToString()); 
} 
+0

Tôi muốn một tệp .csv làm các byte trả lại chúng từ một yêu cầu HttpGet dưới dạng tệp cho người dùng. – HelloWorld

+0

Bạn có thực sự muốn tạo một tệp csv trên đĩa hay chỉ các byte để trả về? –

+0

Trả về byte [] là đủ - nếu có thể - – HelloWorld

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