C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ファイルを閉じたい


(過去ログ 40 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■21020 / inTopicNo.1)  ファイルを閉じたい
  
□投稿者/ adrian_beltre (14回)-(2008/06/23(Mon) 17:12:34)

分類:[C#] 

現在下のプログラムでファイルを閉じて終わる方法を私は模索しています。閉じるのところでoutFileNameを閉じる方法が分かる方がいれば教えてくださいお願いいたします。

開発環境 Microsoft Visual Studio 2005
開発言語 C#

        //AESCryptoServiceProviderオブジェクトの作成
System.Security.Cryptography.RijndaelManaged des =
new System.Security.Cryptography.RijndaelManaged();

//共有キーと初期化ベクタを決定
//パスワードをバイト配列にする
byte[] bytesKey = System.Text.Encoding.UTF8.GetBytes(key);
//共有キーと初期化ベクタを設定
des.Key = ResizeBytesArray(bytesKey, des.Key.Length);
des.IV = ResizeBytesArray(bytesKey, des.IV.Length);

//暗号化されたファイルを読み込むためのFileStream
fsIn =
new System.IO.FileStream(fileName,
System.IO.FileMode.Open, System.IO.FileAccess.Read);

//AES復号化オブジェクトの作成
System.Security.Cryptography.ICryptoTransform desdecrypt =
des.CreateDecryptor();
//読み込むためのCryptoStreamの作成
cryptStreem =
new System.Security.Cryptography.CryptoStream(fsIn,
desdecrypt,
System.Security.Cryptography.CryptoStreamMode.Read);

//復号化されたファイルの保存先
if (fileName.ToLower().EndsWith(".enc"))
outFileName = fileName.Substring(0, fileName.Length - 4);
else
outFileName = fileName + ".dec";
//復号化されたファイルを書き出すためのFileStream
fsOut =
new System.IO.FileStream(outFileName,
System.IO.FileMode.Create, System.IO.FileAccess.Write);

//復号化されたデータを書き出す
byte[] bs = new byte[256];
int readLen;
while ((readLen = cryptStreem.Read(bs, 0, bs.Length)) > 0)
fsOut.Write(bs, 0, readLen);

//閉じる
cryptStreem.Close();
fsIn.Close();
fsOut.Close();
引用返信 編集キー/
■21021 / inTopicNo.2)  Re[1]: ファイルを閉じたい
□投稿者/ επιστημη (1112回)-(2008/06/23(Mon) 17:15:16)
επιστημη さんの Web サイト
> 閉じるのところでoutFileNameを閉じる方法

outFileNameは文字列だから閉じるもヘッタクレもないような...

引用返信 編集キー/
■21022 / inTopicNo.3)  Re[2]: ファイルを閉じたい
□投稿者/ adrian_beltre (15回)-(2008/06/23(Mon) 17:18:43)
επιστημη さん

すいません。私の書き方が悪かったです。ここで作られた復号化されたファイルを閉じて、削除する方法を分かれば教えてください。

No21021 (επιστημη さん) に返信
>>閉じるのところでoutFileNameを閉じる方法
>
> outFileNameは文字列だから閉じるもヘッタクレもないような...
>
引用返信 編集キー/
■21023 / inTopicNo.4)  Re[3]: ファイルを閉じたい
□投稿者/ επιστημη (1113回)-(2008/06/23(Mon) 17:33:24)
επιστημη さんの Web サイト
> 削除する方法を分かれば教えてください。

System.IO.File.Delete(ファイル名);
で削除されないんですか?

引用返信 編集キー/
■21045 / inTopicNo.5)  Re[4]: ファイルを閉じたい
□投稿者/ adrian_beltre (16回)-(2008/06/24(Tue) 00:02:17)
No21023 (επιστημη さん) に返信

この方法で行うと他のプロセスで使用しているためアクセスできませんと言われます。
引用返信 編集キー/
■21046 / inTopicNo.6)  Re[5]: ファイルを閉じたい
□投稿者/ ま (58回)-(2008/06/24(Tue) 00:36:38)
No21045 (adrian_beltre さん) に返信
> ■No21023 (επιστημη さん) に返信
>
> この方法で行うと他のプロセスで使用しているためアクセスできませんと言われます。

閉じる前に削除?

作ってすぐ削除なら、BinaryReader/Writer と MemoryStream でよろしいのでは?

引用返信 編集キー/
■21047 / inTopicNo.7)  Re[5]: ファイルを閉じたい
□投稿者/ れい (672回)-(2008/06/24(Tue) 01:22:25)
No21045 (adrian_beltre さん) に返信
> ■No21023 (επιστημη さん) に返信
>
> この方法で行うと他のプロセスで使用しているためアクセスできませんと言われます。

「この」?
「その」ではないですか?
指示語はちゃんと使わないと分からなくなりますよ。

ま さんが言っているように、Closeする前に削除しようとしていると、
アクセス違反になります。
その際、ファイルを開いているのが「自プロセス」であっても「他のプロセスで…」と言われます。

閉じてから削除するようにすれば大抵は問題ありません。
ただし、閉じて削除するまでの間に、本当に他のプロセスがそのファイルを開いた場合は削除に失敗します。

それを避けたい場合、
Vista以降であればファイルを閉じる前に、
Win32APIのSetFileInformationByHandleを呼べば可能です。
FILE_DISPOSITION_INFOを使います。

引用返信 編集キー/
■21063 / inTopicNo.8)  Re[6]: ファイルを閉じたい
□投稿者/ PATIO (88回)-(2008/06/24(Tue) 11:52:41)
fsOut.Close();の後でεπιστημη さんの指摘されている方法で削除できませんか?
fsOut.Close();が正にファイルを閉じるという部分だと思いますけれど。

> ただし、閉じて削除するまでの間に、本当に他のプロセスがそのファイルを開いた場合は削除に失敗します。
>
> それを避けたい場合、
> Vista以降であればファイルを閉じる前に、
> Win32APIのSetFileInformationByHandleを呼べば可能です。
> FILE_DISPOSITION_INFOを使います。

このケースってウイルス対策ソフト関連が絡むとありえますかねぇ。
そのタイミングで開くって言うのは結構難しいと思うんですけれど。

引用返信 編集キー/
■21065 / inTopicNo.9)  Re[7]: ファイルを閉じたい
□投稿者/ れい (674回)-(2008/06/24(Tue) 12:12:54)
No21063 (PATIO さん) に返信
> このケースってウイルス対策ソフト関連が絡むとありえますかねぇ。
> そのタイミングで開くって言うのは結構難しいと思うんですけれど。

難しいでしょうが、ありえますよね。

ウィルス対策ソフトもそうですし、
フォルダを他プロセス・他スレッドが監視してる場合も
確率があがるでしょうね。

DeleteをTryで囲って例外は無視、
というので殆どの場合問題にならないでしょうが、
それをキモチワルイと思う人がいてもおかしくないと思います。

私も、ファイルの内容によってはかなりキモチワルイと感じます。
引用返信 編集キー/
■21066 / inTopicNo.10)  Re[8]: ファイルを閉じたい
□投稿者/ ちゃっぴ (122回)-(2008/06/24(Tue) 12:59:47)
ちゃっぴ さんの Web サイト
> DeleteをTryで囲って例外は無視、

無視というか再試行ですかね。。。処理の内容によりますが。
どちらにしろ、例外が発生した場合にどうするか?は決めておかないと。
引用返信 編集キー/
■21068 / inTopicNo.11)  Re[9]: ファイルを閉じたい
□投稿者/ adrian_beltre (17回)-(2008/06/24(Tue) 13:32:05)
PATIOさん

fsOut.Close();
System.IO.File.Delete(ファイル名);
で行うことができました。ご協力ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -