2017-07-09 8 views
0

これは私がstackoverflow、非常にエキサイティングで尋ねた最初の質問です。私の文法やその他のタイプのミスについては申し訳なく思っていますが、修正していただければ幸いです。私はCSVファイルが特定のフォルダに最初に存在する場合、それをList変数に格納し、いくつかの新しい行を追加し、同じファイルに書き込むプログラムを作成したいと思います。このプロセスは、しばらくの間連続して繰り返されます。C#と並行してユーザーがExcelで開いたときにcsvファイルを読み書きする方法は?

ファイルがプログラムによって読み書きされている間、メモ帳で開かれている場合、エラーは発生せず、プログラムはファイルに同時にアクセスできます。しかし、それがOffice Excelで開かれている場合、プログラムは "ファイルアクセスが他のプロセスで使用されているため拒否されました"というエラーを出します。

1)プログラムに優先順位を付けることができるので、プログラムはファイルにアクセスできますが、ユーザーはできませんか?それとも、プログラムとユーザーの両方がファイルにアクセスできるか?

2)ソリューションがメモ帳でファイルを開く場合、このファイルの既定のプログラムをメモ帳として設定する方法はありますか?または、どのように私はcsvファイルのデフォルトプログラムをC#からメモ帳として変更できますか?コードの

読み書きの部分は、ベローズの通りです:あなたの助けのための

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()); 

感謝。

+0

ログファイルを作成しているので、あなたが現在経験している落とし穴の多くを避けて、あなたを助けることができる非常に一般的な既存のライブラリを考えましたか? – oerkelens

+1

書き込まれているログファイルを読むには、メモ帳++を使用することを検討してください。それは基本的にあなたの標準的なメモ帳ですが、ステロイドです。 1つの便利なことは、ファイルが変更されたときに通知してリロードすることができるため、ログを非常に簡単に監視できることです。拡張子を.csvから.logまたは.txtに変更すると、Excelがファイルbtwを開くのを停止します。 – oerkelens

+0

お返事ありがとうございます。実際には、新しい行ごとに36バイトをファイルにバイナリ形式で書き出します。これは288列を意味し、期間は500ミリ秒であるため、ファイルには行と列が多すぎます。 Excelを使用していると思います。そのため、私はcsv拡張を選択します。 – Baacus

答えて

0

質問2:Windowsを使用している場合は、デフォルトプログラムを変更するには、「スタート」をクリックして「デフォルトプログラム」と入力します。ウィンドウのバージョンに応じて、基本的に 'プロトコルのファイルタイプをプログラムに関連付ける'または 'ファイルタイプ別にデフォルトのアプリケーションを選択する'を選択し、csvファイルを調整して新しいデフォルトプログラムを使用します。

プログラムとメモ帳の両方が同じ時間にファイルにアクセスできる場合は、非常に注意が必要です。最初にブロックされた理由は、ファイルの内容を上書きしないようにすることでした。おそらく、プログラムとメモ帳でファイルを開くと、最初にテストすることになります。その後、プログラムが更新されます。また、メモ帳で別の更新プログラムを作成します。両方の変更を記録するか?私はあなたがあなたの変更のいくつかを失う可能性がある '最後の保存'の勝利を疑う。

質問1:私は、ファイルを開いた人が最初にそのファイルをロックしていると推測していました。そのため、Excelがファイルを開いている場合、プログラムにはそのエラーが発生します。逆に、プログラムがファイルを開いていた場合、Excelはそのファイルを開く際に問題が発生する可能性があります。私はプログラムに優先権を与える方法がわかりません。

+0

お返事ありがとうございました。私は手動でWindowsから拡張機能のデフォルトプログラムを変更する方法を知っています。私はファイルを右クリックし、プロパティを選択し、別のプログラムで "open with"機能を変更します。しかし**プログラムが** C#から書いた** only ** csvファイルのデフォルトプログラムを変更することは可能ですか?**または、すべてのcsvファイルのデフォルトプログラムをメモ帳として変更することは可能です** C#からもう一度?** – Baacus

+0

通常、CSVファイルにはOSにファイルのソースを示す「フラグ」がないため、選択したデフォルトプログラムがすべてのCSVファイルに使用されます。 –

関連する問題