ShellExecute関数について


xyz  2006-09-21 05:06:02  No: 63077

お世話になります。

下記のようにShellExecuteにて、メモ帳でテキストファイルを開く処理を
行っているのですが、
「プロセスはファイルにアクセスできません。別のプロセスが使用しています。」
とメッセージが表示され、開くことができません。

ShellExecute(NULL, "open", "notepad.exe", c:\a.txt, NULL, SW_SHOW);

なお、
・エクスプローラから、c:\a.txtのファイルを直接開くことは可能です。
・a.txtファイルの容量を小さく(テキストファイルの内容を一部削除)すると
  ShellExecuteにて開くことが可能です。

原因がわからなくて困っているので、どなたか教えてください。
よろしくお願いします。


Blue  2006-09-22 19:36:50  No: 63078

マルチポスト=マナー違反(しかも2回目)
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=751469&SiteID=7

>ShellExecute(NULL, "open", "notepad.exe", c:\a.txt, NULL, SW_SHOW);
このコード絶対おかしいですが。
ファイル名を"で囲っていないし、\をエスケープしていない。

それと、VCのバージョンと、OSのバージョンは必ず明記してください。
OSによって挙動が違うAPIとかあったりしますので。


xyz  2006-09-23 01:01:35  No: 63079

回答ありがとうございます。

>マルチポスト=マナー違反(しかも2回目)

すみません。
どうしても解決したいために、
幅広い方に、見てもらいたかったものですから。

両方の掲示板に各々リンクを貼れば問題ないでしょうか?

>>ShellExecute(NULL, "open", "notepad.exe", c:\a.txt, NULL, SW_SHOW);
>このコード絶対おかしいですが。
>ファイル名を"で囲っていないし、\をエスケープしていない。

ご指摘のとおりです。
実際のコードは、ご指摘の点は、しっかり書いております。

>それと、VCのバージョンと、OSのバージョンは必ず明記してください。
>OSによって挙動が違うAPIとかあったりしますので。

OSは、WindowsXPです。

マナー違反をして大変申し訳ありませんが、
本当に困っているので、
解決方法を教えていただけたらと思います。

よろしくお願いします。


Blue  2006-09-23 01:17:52  No: 63080

> VCのバージョン
も明記してくださいね。

開こうとするファイルはその前の処理で使ってたりしていますか?

> ・エクスプローラから、c:\a.txtのファイルを直接開くことは可能です。
メモ帳で開けますか?

> ・a.txtファイルの容量を小さく(テキストファイルの内容を一部削除)すると
>  ShellExecuteにて開くことが可能です。
だいたい何Byteあたりから開けない状態になるのでしょうか?


xyz  2006-09-23 02:36:13  No: 63081

回答ありがとうございます。

> VCのバージョン
VC++6.0です。

>開こうとするファイルはその前の処理で使ってたりしていますか?
ファイルを開いていますが、閉じる処理は行っています。

>メモ帳で開けますか?
開けました。

>だいたい何Byteあたりから開けない状態になるのでしょうか?
約1500KBで開けず、約1100KBで開けました。


Blue  2006-09-23 02:48:19  No: 63082

>ファイルを開いていますが、閉じる処理は行っています。
はどのようにしてファイルを扱っていますか?

fopen〜fclose?
CreateFile〜CloseHandle?


kure  2006-09-23 02:49:59  No: 63083

ファイルを開く処理と閉じる処理について
具体的にどういったことをやっているか、
どういった関数を呼び出しているかを提示してください。

#バッファがフラッシュされてなくて
#プロセスがファイルを握ったままになっているとか?


みい  2006-09-23 02:51:41  No: 63084

うちの環境(XP(SP2)、VC++6.0(SP5)、MFCアプリケーション)で
4MB程度のc:\a.txt作って、
ShellExecute(NULL, "open", "notepad.exe", "c:\\a.txt", NULL, SW_SHOW);
やったら無事開きます。
どっかにまずい処理があると思いますよ。


PATIO  2006-09-25 20:20:30  No: 63085

みいさんがされているようにこういうときは、
問題部分のみの簡単なテストプログラムを作成して
テストするのが効果が高いです。
これによって問題にしている部分のコード以外のところに問題がある場合との
切り分けが出来るようになります。
真の原因がサイズなのか、結果的にサイズが関連しているのかも見極める必要があります。


xyz  2006-09-27 05:31:40  No: 63086

回答ありがとうございます。
返信おそくなりました。

>ファイルを開く処理と閉じる処理について
>具体的にどういったことをやっているか、
>どういった関数を呼び出しているかを提示してください。

開こうとしているファイルは、FORTRANで書かれた計算プログラムの
計算結果ファイルです。
FORTRAN部分はブラックボックスのため、わからない状況ですが、
ファイルはちゃんと閉じているとおもいます。

理由は、計算結果ファイルが小さい場合は開けているためです。
(計算結果ファイルの大小は、シミュレーション計算時間の長さによります。
  ※シミュレーション時間が短ければ計算結果結果ファイルを開くことはできています。)

今のところこのような状況です。
なにか気づいた点があればおしえてください。


xyz  2006-09-27 06:39:53  No: 63087

先程の投稿で、

>FORTRAN部分はブラックボックスのため、わからない状況ですが、
>ファイルはちゃんと閉じているとおもいます。

としましたが、やはり、FORTRANプログラムで出力された計算結果ファイルは、
閉じられていないという結論にいたりました。

というのは、
計算結果ファイル「a.txt」をコピーし、「b.txt」を作成し、
そのファイルをShellExecute関数で開くようにしたところ、
ファイル容量にかかわらず開くことができたからです。

FORTRAN部分について変更することが非常に困難な状況(他で作られたPG)
で、このように、ファイルコピーを行い、コピーしたファイルを開くことで、
対処しようと考えていますが、何か問題はあるでしょうか?


Blue  2006-09-27 18:36:04  No: 63088

いきなりShellExecuteで開こうとしないで、
対象ファイルが使える状態になっているかCreateFile等で開いて確認するのはどうでしょうか?(すぐ閉じるけど)
開けなければループして再度確認するような感じで。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加