当用户与C#并行使用Excel打开csv文件时,如何读写?

时间:2017-07-09 11:38:04

标签: c# excel csv

这是我在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());

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题2:为了更改默认程序,如果您使用的是Windows,则可以单击开始并查找/键入&#39;默认程序&#39;。根据Windows的版本,基本上找到&#39;将协议的文件类型与程序&#39;或者按文件类型选择默认应用程序&#39;并调整csv文件以使用新的默认程序。

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

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