前提・実現したいこと
現在同一のイベント内で一旦平文のままCSV出力し、出力処理の後にさらにそのCSVファイルを読み込んで内容を暗号化する機能を実装しています。
CSVを出力する処理とファイルの内容を暗号化する処理を別々で動かすと正常に動作するのですが、それぞれの処理をまとめて関数化するところで苦戦しています。
CSVの出力にはCsvHelperを使っています。
発生している問題・エラーメッセージ
"別のプロセスで使用されているため、プロセスはファイル 'C:\test\sample.csv' にアクセスできません。"
FileEncrypt
の一番最後のusingの箇所で上記のエラーが発生します。
c#
using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
該当のソースコード
c#
{ string Path = @"C:\test\sample.csv"; //CSV出力 using (var streamWriter = new StreamWriter(Path , true, Encoding.GetEncoding("shift_jis"))) using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture)) { csvWriter.Configuration.HasHeaderRecord = true; csvWriter.Configuration.RegisterClassMap<EntityMappper>(); csvWriter.WriteRecords(EntityList); } //暗号化 FileEncrypt(Path); } private void FileEncrypt(string FilePath) { byte[] buffer = new byte[4096]; //Output file path. string OutFilePath = Path.Combine(Path.GetDirectoryName(FilePath), Path.GetFileNameWithoutExtension(FilePath)) + ".enc"; using (FileStream outfs = new FileStream(OutFilePath, FileMode.Create, FileAccess.Write)) { using (AesManaged aes = new AesManaged()) { ... //Encryption interface. ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (CryptoStream cse = new CryptoStream(outfs, encryptor, CryptoStreamMode.Write)) { outfs.Write(salt, 0, 16); // salt をファイル先頭に埋め込む outfs.Write(aes.IV, 0, 16); // 次にIVもファイルに埋め込む using (DeflateStream ds = new DeflateStream(cse, CompressionMode.Compress)) //圧縮 { using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { while (len = (fs.Read(buffer, 0, 4096)) > 0) { ds.Write(buffer, 0, len); } } } } } } }
試したこと
エラーの発生したusingにて、
- FileAccess.ReadではなくFileAccess.ReadWriteを渡す
using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite))
→ 上記と同様のエラー
- 引数にFileShare.ReadWriteを追加
using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
→ エラーは発生しなくなるが、その後の処理でlen
が0
using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { while (len = (fs.Read(buffer, 0, 4096)) > 0) { ds.Write(buffer, 0, len); } }
Csv書き込みをしたusingの外で暗号化の処理をしているので、usingを出た時点でファイルは一度閉じられて再度暗号化のためにファイルを開くという想定なのですが、どうもそうではないらしくどうしたらよいのかかなり悩んでおります。
プロセスやファイルの読み書きについての理解が浅く恐縮ですが、よろしくお願いします。
まだ回答がついていません
会員登録して回答してみよう