Tag: streamwriter

使用StreamWriter实现滚动日志,并从顶部删除

我的C#winforms 4.0应用程序一直使用线程安全的编写器来执行内部调试日志记录信息。 当我的应用程序打开时,它会删除该文件并重新创建它。 当应用关闭时,它会保存文件。 我想要做的是修改我的应用程序,以便它可以附加而不是替换。 这是一个简单的修复。 但是,这是我的问题: 我想保留我的日志文件最大10兆字节。 我的约束很简单。 当您关闭文件时,如果文件大于10兆字节,则删除前10%。 是否有一种“更好”的方式,然后执行以下操作: 关闭文件 检查文件是否大于10兆 如果是这样,请打开该文件 解析整个事情 剔除前10% 把文件写回来 关 编辑:好吧,我最后滚动自己(如下所示)移动到Log4Net的建议是一个很好的建议,但是学习新库和移动所有日志语句(数千)的时间不是时间对我试图做的小改进有效。 private static void PerformFileTrim(string filename) { var FileSize = Convert.ToDecimal((new System.IO.FileInfo(filename)).Length); if (FileSize > 5000000) { var file = File.ReadAllLines(filename).ToList(); var AmountToCull = (int)(file.Count * 0.33); var trimmed = file.Skip(AmountToCull).ToList(); File.WriteAllLines(filename, trimmed); } }

我可以从运行在其上的Web API应用程序将文件写入服务器计算机上的文件夹吗?

我在我的Web API应用程序中使用此代码来写入CSV文件: private void SaveToCSV(InventoryItem invItem, string dbContext) { string csvHeader = “id,pack_size,description,vendor_id,department,subdepartment,unit_cost,unit_list,open_qty,UPC_code,UPC_pack_size,vendor_item,crv_id”; int dbContextAsInt = 0; int.TryParse(dbContext, out dbContextAsInt); string csvFilename = string.Format(“Platypus{0}.csv”, dbContextAsInt); string csv = string.Format(“{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}”, invItem.ID, invItem.pksize, invItem.Description, invItem.vendor_id, invItem.dept, invItem.subdept, invItem.UnitCost, invItem.UnitList, invItem.OpenQty, invItem.UPC, invItem.upc_pack_size, invItem.vendor_item, invItem.crv_id); string existingContents; using (StreamReader sr = new StreamReader(csvFilename)) { existingContents = sr.ReadToEnd(); } […]

如何在C#中检测套接字断开

我正在研究一种客户端/服务器关系,它意味着在不确定的时间内来回推送数据。 我试图克服的问题是在客户端,因为我无法找到检测断开连接的方法。 我已经在其他人的解决方案上进行了几次传递,从捕获IOexception到轮询所有三个SelectMode上的套接字。 我还尝试使用轮询的组合,并检查套接字的“可用”字段。 // Something like this Boolean IsConnected() { try { bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead); bool part2 = (this.Connection.Client.Available == 0); if (part1 & part2) { // Never Occurs //connection is closed return false; } return true; } catch( IOException e ) { // Never Occurs Either } } 在服务器端,尝试向客户端写入“空”字符(\ 0)会强制执行IOexception,服务器可以检测到客户端已断开连接(非常简单)。 在客户端,相同的操作不会产生exception。 […]

c#替换文件中的字符串

替换HTML文件内容的一部分时,String.Replace似乎无法正常工作。 例如,String.Replace用blah blah blah html>替换 blah blah blah html> – 注意第二个HTML结束标记未正确关闭,因此在页面呈现时显示用户的浏览器。 任何人都知道为什么它没有按预期工作? StreamReader sr = fi.OpenText; String fileContents = sr.ReadToEnd(); sr.close(); fileContents = fileContents.Replace(“”, “”); fileContents = fileContents.Replace(“”,”blah blah blah “); StreamWriter sw = new StreamWriter(fi.OpenWrite()); sw.WriteLine(contents); sw.close();

如何通过手动输入流将命令提供给cmd.exe进程?

问题听起来有点密集。 这是一个稍长的版本: 我需要让主循环等待用户输入,并且还要运行一个进程并等待用户输入要发送到的流的输入。 全文:我正在构建一个Cmd模拟器,起初一切看起来都很好:用户输入一个命令,它会回显到输出区域,处理完毕,StdOut和StdErrOut被捕获并添加到输出TextBox中。 唯一的问题是,当为每个命令创建并单独启动cmd进程时,没有保留任何状态。 既不是变量也不是代码页,也不是工作目录等。 所以我决定发明一点hack:输入一个开括号或右括号开始和停止收集命令而不是执行它们。 在右括号之后,在processBatch方法中使用命令列表(’batch’)将它们全部提供给cmd进程,并将其重定向输入。 工作得很好。 唯一的问题是,显然,现在我已经获得状态但是立即失去了响应,因此在批处理运行之前不会弹出任何错误。 因此,我决定将好的部分结合起来,而且,当我意识到,为了保持两个循环工作并等待我必须使用线程,我知道我正在找麻烦。 多年来我没有做过…… 在布局中,我选择了main()循环等待用户输入,startCMDtask()在任务中运行startCMD()。 这里扫描输入流,直到有数据,然后cmd进程处理它们。 但它不起作用。 List batch = new List(); public volatile string output = “+”; public volatile string outputErr = “-“; Process CMD; Task cmdTask; volatile Queue cmdQueue = new Queue(); volatile public bool CMDrunning = false; 这个工作得很好 private void processBatch() { Process p […]

使用StreamWriter写入时,C#程序崩溃

mscorlib.dll中出现未处理的“System.IO.IOException”类型exception 它仅在文件已创建时有效。 当我删除文件并从头开始时,它会出现以下错误 码: private void Btn_Create_Click(object sender, EventArgs e) { string path = Environment.CurrentDirectory + “/”+ “File.txt”; if (!File.Exists(path)) { File.CreateText(path); MessageBox.Show(“File Created Successfully”); } else { MessageBox.Show(“File Already Created”); } } private void Btn_Write_Click(object sender, EventArgs e) { using (StreamWriter sw = new StreamWriter(“File.txt”)) { sw.WriteLine(“Hello World”); } } private void Btn_Read_Click(object sender, […]

尽管append = false,但无法关闭文件,因此无法使用streamwriter覆盖文件

使用C#VS 2010,Windows窗体。 我的目标是只打开和关闭文件一次,并多次“覆盖”它。 我永远不想追加。 打开和关闭文件一次的原因是我希望写操作最快。 我在streamwriter构造函数中传递append = false但它仍然附加而不是覆盖。 private void testSpeed() { StreamWriter sw1 = new StreamWriter(@”d:\logfolder\overwrite.txt”, false); sw1.AutoFlush = true; for (int i = 0; i < 5000; i++) { sw1.Write(i); } sw1.Close(); } 我的预期输出是文件应该只有4999但我得到这个而不是0123456789101112131415161718192021222324252627282930313233 ……………一直到4999 此文件已存在d:\ logfolder \ overwrite.txt 我的错误是什么想法?

任何人都可以告诉为什么在使用StreamWriter保存数据时仍然显示以前的数据

我使用Stream writer将数据保存到文件名,但如果我第二次运行代码,则相同的数据会附加到以前的数据但我想清除旧数据并写入数据 我在文本文件中应该有的数据应如下所示 101 435435345 3445454541104021031A094101 52251 1 1 CCD1 110402110402 1111000020000001 6281110000251 00000000011 1 1 0111000020000001 822500000100111000020000000000010000000000001 111000020000001 9000001000001000000010011100002000000000001000000000000 我的示例代码 if (i == 0) { index++; string m_strDate = DateTime.Now.ToString(“yyyy/MM/dd”); m_strDate = m_strDate.Replace(“/”, “”); StrFilePath = “log” + m_strDate + index + “.txt”; } using (StreamWriter sw = new StreamWriter(StrFilePath,true)) { using (StreamReader sr […]

自闭式StreamWriter单例

我试图在其生命周期结束时进一步缩小Flush StreamWriter中的问题,实现类似单例的自关闭StreamWriter : class Foo : System.IO.StreamWriter { private static readonly Foo instance = new Foo( “D:/tmp/test” ); private Foo( string path ) : base( path ) { } ~Foo() { this.Close(); } public static Foo Instance { get { return instance; } } } 预期的效果是在像这样的示例程序中 class Program { private static void Main( string[] args […]

C# – FileStream:既可以锁定文件又可以在不截断文件的情况下读取文件并将其截断

我想我的标题不是那么清楚。 我会试着解释一下: 我可以使用FileStream编写和读取文件 FileStream fs = new FileStream(“C:\\Users\\Public\\text.txt”, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); private void button1_Click(object sender, EventArgs e) { fs.Seek(0,0); StreamReader sr = new StreamReader(fs); textbox.Text = sr.ReadToEnd(); } private void button2_Click(object sender, EventArgs e) { StreamWriter sw = new StreamWriter(fs); sw.Write(textbox.Text); sw.Flush(); } 这种方式其他程序无法使用该文件,但我也无法删除内容。 写入它只会添加字符串,它不会替换内容。 或者我可以在没有FileStream的情况下完成: private void button1_Click(object sender, EventArgs e) { StreamReader sr […]