DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ファイルのロックはどうやるの

環境/言語:[VC# 2005 )、.NET Framework2.0]
分類:[.NET]

いつも参考にさせてもらっています。

VB6 から 最近 VC#2005 に移行しました。

http://dobon.net/vb/dotnet/graphics/index.html

上記を参考に画像を縮小保存する簡単なサンプルを作りました。

ソース
fileName = openFileDialog1.FileName;
//まず、縮小保存
pictureBox0.Visible = false;
Int32 w = 640;
Int32 h = 480;
pictureBox0.Image = Image.FromFile(fileName);
Bitmap bm = new Bitmap(pictureBox0.Image, w, h);
String path = Application.StartupPath;
bm.Save(path + "\\Resize.jpg", Imaging.ImageFormat.Jpeg);
//BitmapとGraphicsオブジェクトを破棄
bm.Dispose();
pictureBox0.Image.Dispose();
pictureBox0.Image = null;

これで問題なく縮小保存できて喜びましたが、保存後のファイルを別アプリ(Gimp)で編集中でも、ファイルが上書きされてしまいます。エラーも発生しません。

過去の掲示板や手持ちの資料、 WEB でも探しましたが、該当するようなことは見つけれ荒れませんでした。
ものすごく簡単なことかもしれませんが、よろしくお願いします。
■No20347に返信(したっぱさんの記事)
自己レスです。

> 過去の掲示板や手持ちの資料、 WEB でも探しましたが、該当するようなことは見つけれ荒れませんでした。

(お恥ずかしいことに「見つけれ荒れませんでした。」は「見つけられませんでした。」です。訂正させていただきます。)

「ファイル ロック アンロック」で探していたのが原因のようです。
「ファイル アクセス」で検索したらたくさん見つかりました。

System.IO.FileStream を使用するのですね。

いま質問を読み返して、わかりにくく感じましたので、もう一度ここで整理しようと思います。

1:Original.jpg(縮小前)ファイルを System.IO.FileShare.None で排他的に確保する。

2:Resize.jpg(縮小後)ファイルを同様に確保する。
  このとき、ファイルが存在しなければ、作成し、確保する。

3:前回 ■No20347 のようにファイルを縮小する。

4:確保したファイルをそれぞれ開放する。

この手順でやってみようと思います。
■No20348に返信(したっぱさんの記事)
またまた自己レスです。

> 3:前回 ■No20347 のようにファイルを縮小する。

FileStream なので、System.Drawing.Bitmap の Save メソッドには FileStream を使いました。

一応コードを残しておきます。

Int32 w = 640;
Int32 h = 480;
fileName = openFileDialog1.FileName;
String path = Application.StartupPath;

using (FileStream fs0 = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
{
pictureBox0.Image = Image.FromStream(fs0);
}

using (FileStream fs1 = new FileStream(path + "\\Resize.jpg", FileMode.Open, FileAccess.Write, FileShare.None))
{
Bitmap bm = new Bitmap(pictureBox0.Image, w, h);
bm.Save(fs1, System.Drawing.Imaging.ImageFormat.Jpeg);
bm.Dispose();
}

上記で解決しました。
お目汚し、申し訳ございませんでした。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板