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

ファイルを作成した後に、そのファイルを引数にしてプロセスを起動する方法

環境/言語:[WindowsXP, C#, .NET Framework2.0]
分類:[.NET]

お世話になっております。

ファイルを作成した後に、そのファイルを引数にしてプロセスを起動する方法について
質問させて頂きます。

Button を Click されたら、プロセスを起動する処理(引数はファイルパスになります)があるのですが
ファイルが存在しない場合、ファイルを新規作成した後に、プロセスを起動します。
作成するファイルは、中身のない空ファイルです。

ファイルの拡張子が特殊であり、その特殊な拡張子を持つファイルは
起動時に特定ソフトで開くよう、システムを起動する端末には予め設定されております。
(このあたりは、今回の質問と関係ないと思われるのですが)

以下のコードでは
「プロセスはファイルにアクセスできません。別のプロセスが使用中です」の警告メッセージが表示されます。

// ボタンクリックイベントハンドラ
private void Button_Click( object sender, EventArgs e )
{
string strFile = @"C:\Test\Test.aaa";
if ( ! System.IO.File.Exists( strFile ) ) { // ファイルが存在しない場合、新規作成する
File.Create( strFile );
}
// プロセス起動
System.Diagnostics.Process.Start( strFile );
}

ファイルを作成する処理をスレッドにした場合も、同じ結果になりました。

// ボタンクリックイベントハンドラ
private void Button_Click( object sender, EventArgs e )
{
string strFile = @"C:\Test\Test.aaa";
if ( ! System.IO.File.Exists( strFile ) ) { // ファイルが存在しない場合、新規作成する
TasksClass task = new TasksClass( );
task.FilePath = strFile;
System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart( task.CreateFile ) );
thread.Start( ); // スレッドスタート
thread.Join( ); // 終了するまで待機
thread.Abort( );

if ( ! task.CreateFileResult ) { // 作成に失敗している場合
// file create err
return;
}
}
// プロセス起動
System.Diagnostics.Process.Start( strFile );
}

// ファイル作成用のクラス
public class TasksClass
{
// 作成するファイルのパス(設定専用)
public string FilePath {
set {
this.strFilePath_ = value;
}
}
// ファイル作成結果(読み取り専用)
public bool CreateFileResult {
get {
return this.boolCreateFileResult_;
}
}

private bool boolCreateFileResult_ = false;
private string strFilePath_ = null;

// ファイル作成
// 事前に、作成するファイルのパスを FilePath に設定しておく
public void CreateFile( )
{
this.boolCreateFileResult_ = false;
try {
System.IO.File.Create( this.strFilePath_ );
this.boolCreateFileResult_ = true;
} catch ( Exception ) { }
}
}

どちらもコードも、ファイルは生成されておりますが、Process.Startで警告が出力されます。
既に作成されているファイルを引数にして、Process.Startを実行した場合は、警告が出力されません。
新規作成した後、警告を出さないで、プロセスを起動するには、どのような手段があるか
ご存知の方いらっしゃいましたら、ご教授下さい。
宜しく御願い致します。
File.Create の解説に以下の記述があります。
> このメソッドによって作成された FileStream オブジェクトの FileShare の既定値は、
None です。
> 元のファイルのハンドルが閉じられるまで、作成されたファイルに他のプロセスやコードからアクセスすることはできません。
Create は作るだけでなく、ファイルを開いてそのストリームを返してきます。
Hongliang様

素早い回答、有難うございます。
File.Createメソッドが、FileStream を返しているとは・・・
何度かHelpを見たはずなのに、見逃しておりました (@_@;) 自分のアホバカッ。

以下のコードで、警告が出力されなくなりました。
本当に有難うございました。とても助かりました。

private void Button_Click( object sender, EventArgs e )
{
string strFile = @"C:\Test\Test.aaa";
if ( ! System.IO.File.Exists( strFile ) ) { // ファイルが存在しない場合、新規作成する
System.IO.FileStream fs = System.IO.File.Create( strFile );
fs.Close( );
}
System.Diagnostics.Process.Start( strFile );
}
解決済み!

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