【发布时间】:2017-07-09 11:38:04
【问题描述】:
这是我在stackoverflow上问的第一个问题,很激动。非常抱歉我的语法和其他类型错误,如果您纠正它们,我将不胜感激。我想编写一个程序,如果它首先存在于特定文件夹中,则读取 csv 文件,将其存储在 List 变量中,添加一些新行并将其写入同一个文件。这个过程会在一段时间内不断重复。
当程序正在读取和写入文件时,如果使用记事本打开文件,则不会出错,程序可以并行访问文件。但是如果使用 Office Excel 打开它,程序会给出错误消息“文件访问被拒绝,因为它被另一个进程使用......”。我想问你:
1) 是否可以优先考虑程序,所以程序仍然可以访问文件但用户不能?还是程序和用户都可以访问该文件?
2) 如果解决方案是使用记事本打开文件,有没有办法将此文件的默认程序设置为记事本?或者如何从 C# 将 csv 文件的默认程序更改为记事本?
部分代码读写如下:
List<string> csvLines = new List<string>();
string address = folderpath + @"\PLC_LOGLARI";
if (!Directory.Exists(address))
Directory.CreateDirectory(address);
string fileAddress = address + @"\" + fileName + "_" + machineNo + "_1.csv";
if (Directory.EnumerateFiles(address).Any(f => f.Contains(fileName + "_" + machineNo)))
{
string[] addressArray = Directory.GetFiles(address, fileName + "_" + machineNo + "*.*");
FileInfo fileInformation = new FileInfo(addressArray[addressArray.Length - 1]);
long fileSize = fileInformation.Length;
if (fileSize > 5000000)
{
int fileNo = int.Parse(addressArray[addressArray.Length - 1].Substring(addressArray[addressArray.Length - 1].LastIndexOf('_') + 1, 1)) + 1;
fileAddress = addressArray[addressArray.Length - 1].Substring(0, addressArray[addressArray.Length - 1].LastIndexOf('_') + 1) + fileNo.ToString() + ".csv";
}
else
{
fileAddress = addressArray[addressArray.Length - 1];
csvLines = File.ReadAllLines(address).ToList();
}
}
else
{
string[] headings = makeHeadings();
csvLines.Add(headings[0]);
csvLines.Add(headings[1]);
}
string newLine = "";
// some operations and calculations for newLine
// some operations and calculations for newLine
// some operations and calculations for newLine
newLine = newLine.Substring(1, newLine.Length-1);
csvLines.Add(newLine);
File.WriteAllLines(fileAddress, csvLines.ToArray());
感谢您的帮助。
【问题讨论】:
-
由于您正在编写日志文件,您是否考虑过任何非常常见的现有库可以帮助您,避免您现在遇到的许多陷阱?
-
至于读取正在写入的日志文件,可以考虑使用 Notepad++。它基本上是您的标准记事本,但使用了类固醇。它所做的一件有用的事情是,它会在文件发生更改时通知您并允许您重新加载它——因此您可以非常轻松地监控日志。将扩展名从 .csv 更改为 .log 或 .txt 会阻止 Excel 打开文件,顺便说一句。
-
感谢您的回复。实际上它每新行以二进制格式将36字节写入文件,即288列,周期为500毫秒,因此文件中的行和列太多,查看数据的最佳方法是我想使用 Excel,这就是我选择 csv 扩展名的原因。