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

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

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

Re[2]: FileStreamを閉じずにファイル名を変更する方法


(過去ログ 168 を表示中)

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

■97228 / inTopicNo.1)  FileStreamを閉じずにファイル名を変更する方法
  
□投稿者/ 烏賊 (1回)-(2021/04/18(Sun) 14:05:54)

分類:[.NET 全般] 


C#あるいはVB.NETに関する質問です。


Dim stream As Stream

Sub Test()

stream = File.OpenRead(FilePath)

End Sub


という感じで、ファイルをストリームに読み込んだ状態で、
読み込んだファイルのファイル名を変更したいのですが、
一旦、Closeしてから再度読み込み直さないと変更できないでしょうか?

ストリームを保持したまま、
ファイル名を変更することはできないでしょうか?




引用返信 編集キー/
■97229 / inTopicNo.2)  Re[1]: FileStreamを閉じずにファイル名を変更する方法
□投稿者/ とっちゃん (722回)-(2021/04/18(Sun) 14:42:16)
No97228 (烏賊 さん) に返信
>
> ストリームを保持したまま、
> ファイル名を変更することはできないでしょうか?
>
リネームは別プロセスも含め、誰もファイルを開いていない状態じゃないとできなかったと思います。

なので、リネームするのではなく、新しい名前のファイルとして保存して、それを保持するというのが良いのではと思います。

感じ的には以下のような感じ(C#で記述)

var prevStream = stream;
stream = File.Create( 新しいファイル名 );
// 実際のセーブ処理ないしは、prevStream から stream に単純コピー
prevStream.Close(); // Dispose でもよい
File.Delete( 元のファイル名 );

引用返信 編集キー/
■97230 / inTopicNo.3)  Re[2]: FileStreamを閉じずにファイル名を変更する方法
□投稿者/ 烏賊 (3回)-(2021/04/18(Sun) 15:00:41)
これって読み込んでいたPositionはリセットされるため、
再度シークする必要があるのですよね?

この方法よりかは単に
一旦Closeしてから、ファイル名を変更して
再度OpenReadした方がストレージへのアクセスが減るため
高速だと思うのですが、
新規作成するメリットはございますでしょうか?
引用返信 編集キー/
■97231 / inTopicNo.4)  Re[3]: FileStreamを閉じずにファイル名を変更する方法
□投稿者/ とっちゃん (723回)-(2021/04/18(Sun) 17:26:32)
No97230 (烏賊 さん) に返信
> これって読み込んでいたPositionはリセットされるため、
> 再度シークする必要があるのですよね?
>
一度クローズした場合も同じですが、シーク位置などは全部リセットされます。


> この方法よりかは単に
> 一旦Closeしてから、ファイル名を変更して
> 再度OpenReadした方がストレージへのアクセスが減るため
> 高速だと思うのですが、
> 新規作成するメリットはございますでしょうか?

リネームのほうが書込みしない分、高速に処理できると思います。
新規作成にメリットがあるかどうかはアプリの仕様次第なので何とも言えません。

プログラム的にやりやすいほう、エラーが発生した場合のリカバリーがしやすいほうで
検討すればいいのではないでしょうか?

引用返信 編集キー/
■97232 / inTopicNo.5)  Re[1]: FileStreamを閉じずにファイル名を変更する方法
□投稿者/ Hongliang (1163回)-(2021/04/18(Sun) 17:37:51)
File.OpenReadではなくてFile.Openの方であれば、FileShareを指定できるオーバーロードがあります。
これでFileShare.Deleteを指定すれば、ほか(自プロセス他プロセス問わず)で名前変更できるようになります。
なお途中でリネームされても、File.Openで開いたFileStreamはちゃんとそのファイルを追跡してくれます。
引用返信 編集キー/
■97233 / inTopicNo.6)  Re[2]: FileStreamを閉じずにファイル名を変更する方法
□投稿者/ とっちゃん (724回)-(2021/04/18(Sun) 20:07:30)
No97232 (Hongliang さん) に返信

FileShare.Delete で行けるのか!それだと、Closeせずにそのままリネームさせることができますね。
削除された場合の考慮は必要になると思いますが、Closeせずにリネームできますね。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -