2015-04-17 17 views
5

Tôi đã tạo một lớp có trách nhiệm tạo tệp văn bản trong đó mỗi dòng đại diện cho thông tin của đối tượng của lớp 'MyDataClass'. Dưới đây là một đơn giản hóa mã của tôi:StreamWriter thêm phần bổ sung vào cuối dòng

public class Generator 
{ 
    private readonly Stream _stream; 
    private readonly StreamWriter _streamWriter; 
    private readonly List<MyDataClass> _items; 

    public Generator(Stream stream) 
    { 
     _stream = stream; 
     _streamWriter = new StreamWriter(_stream, Encoding.GetEncoding("ISO-8859-1")); 
    } 

    public void Generate() 
    { 
     foreach (var item in _items) 
     { 
      var line = AnotherClass.GetLineFrom(item); 

      _streamWriter.WriteLine(line); 
     } 

     _streamWriter.Flush(); 
     _stream.Position = 0; 
    } 
} 

Và tôi gọi lớp này như thế này:

using (var file = new FileStream("name", FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
{ 
    new Generator(file).Generate(); 
} 

Khi tôi chạy các ứng dụng trên visual studio (tôi thử nghiệm với chạy (Ctrl + F5), gỡ lỗi (F5), với chế độ gỡ lỗi và phát hành) tất cả đều theo kế hoạch. Nhưng tôi xuất bản các ứng dụng trong một máy chủ IIS và bây giờ StreamWriter lớp đặt thêm \ r trước khi kết thúc của dòng.

Kiểm tra nó ra đọc thập lục phân của cả hai tập tin được tạo:

Chạy trong Visual Studio: http://www.jonataspiazzi.xpg.com.br/hex_vs.bmp

Chạy trong IIS: http://www.jonataspiazzi.xpg.com.br/hex_iis.bmp

Một số điều tôi đã kiểm tra:

Viết line biến (trong var line = AnotherClass.GetLineFrom(item);) trong nhật ký để xem liệu thêm '\ r' có bị loại bởi lớp AnotherClass hay không.

Không kết quả là gì, lần cuối cùng trong số line là một char thông thường như mong đợi (ví dụ ở trên là khoảng trắng).

Viết mã khác để xem sự cố có chung cho tất cả các phiên bản IIS StreamWriter hay không.

Tôi cố gắng này:

var ms = new MemoryStream(); 
var sw = new StreamWriter(ms, Encoding.GetEncoding("ISO-8859-1")); 

sw.WriteLine("Test"); 
sw.WriteLine("Of"); 
sw.WriteLine("Lines"); 

sw.Flush(); 
ms.Position = 0; 

Trong trường hợp này mã hoạt động tốt cho cả hai visual studio và IIS.

Tôi làm việc này trong 3 ngày, tôi đã thử mọi thứ mà bộ não của tôi có thể nghĩ. Có ai có manh mối nào cho những gì tôi có thể thử không?

CẬP NHẬT

Nhận kì quặc! Tôi cố gắng để thay thế dòng _streamWriter.WriteLine(line); với:

_streamWriter.Write(linhaTexto + Environment.NewLine); 

Và thậm chí tệ hơn:

_streamWriter.Write(linhaTexto + "\r\n"); 

Cả hai tiếp tục tạo ra thêm \r nhân vật.

tôi cố gắng thay thế với điều này:

_streamWriter.Write(linhaTexto + "#\r\n#"); 

Và nhận được:

http://www.jonataspiazzi.xpg.com.br/hex_sharp.bmp

+0

Điều gì xảy ra nếu bạn cố gắng xóa mã hóa? – Steve

+0

Lỗi vẫn còn. Tôi đã thử mà không cần mã hóa, với 'Defaul', với' UTF8' và với '" ISO-8859-15 "'. Tất cả đều cho tôi kết quả tương tự. –

+0

Có thể thêm \ r trong quá trình Truyền tệp từ máy chủ không? –

Trả lời

2

đoán của tôi là thêm \ r được thêm vào trong quá FTP (có thể thử một chuyển nhị phân)

Giống như here

Tôi đã thử nghiệm mã và thêm/r không phải do mã trong câu hỏi hiện tại

+0

Nước mắt của niềm vui lăn trong người bạn khuôn mặt của tôi! –

4

Theo MSDN, WriteLine

Ghi dữ liệu theo sau là một dòng terminator để văn bản chuỗi hoặc luồng.

dòng cuối cùng của bạn nên được

_streamWriter.Write(line); 

Đặt nó bên ngoài vòng lặp của bạn và thay đổi vòng lặp của bạn vì vậy nó không quản lý dòng cuối cùng.

+0

Điều này có thể hoạt động nếu sự cố của tôi chỉ ở dòng cuối cùng. Nhưng vấn đề xảy ra trong tất cả các dòng cuối của tập tin. –

+0

Và nếu bạn thay đổi tất cả writeLine của bạn để viết? – Fjodr

+0

Tôi đã cập nhật câu hỏi để kiểm tra. –

0

Tôi gặp sự cố tương tự. Environment.NewLine và WriteLine đã cho tôi thêm ký tự. Nhưng điều này dưới đây làm việc cho tôi:

StringBuilder sbFileContent = new StringBuilder(); 
sbFileContent.Append(line); 
sbFileContent.Append("\n"); 
streamWriter.Write(sbFileContent.ToString()); 
Các vấn đề liên quan