【问题标题】:How to read and write csv file when it is opened with Excel by the user in parallel with C#?用户使用Excel与C#并行打开csv文件时如何读写?
【发布时间】: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 扩展名的原因。

标签: c# excel csv


【解决方案1】:

对于问题 2:为了更改默认程序,如果您使用的是 Windows,您可以单击开始并查找/键入“默认程序”。根据windows的版本,基本上找到'Associate a file type of protocol with a program'或者'choose a default application by file type'并调整csv文件以使用新的默认程序。

如果程序和记事本都能够同时访问该文件,我会非常小心。首先阻止它的原因是为了防止覆盖文件的内容,因此如果您在程序和记事本中打开它,可能会先对其进行测试。然后程序进行一些更新 - 您还可以使用记事本进行不同的更新。是否会记录这两个更改?因为我怀疑你可能会丢失一些更改的“最后一次保存”胜利。

对于问题 1:我猜首先打开文件的人获得了该文件的锁定。因此,如果 Excel 正在打开文件 - 那么程序就会出现该错误。反之亦然,如果程序打开了文件 - 那么 Excel 可能无法打开该文件。我不确定如何优先考虑该计划。

【讨论】:

  • 非常感谢您的回复。我知道如何手动更改 Windows 扩展的默认程序。我在文件上单击鼠标右键,选择属性并使用不同的程序更改“打开方式”功能。但我想问一下,是否可以更改程序 从 C# 编写的 only csv 文件的默认程序? 或者是否可以更改所有程序的默认程序csv 文件作为记事本再次来自 C#?
  • CSV 文件中通常没有向操作系统指示文件来源的“标志”,因此您选择的任何默认程序都将用于所有 CSV 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多