• ベストアンサー

【C++/CLI】ファイルオープンに失敗した際のエラー処理

VC++2005の.NETで言語はC++/CLIにてアプリを作成しています。 FileStream^ fs; String^ file; fs = gcnew FileStream( file, FileMode::Open ); にてファイルをオープンする処理を入れたのですが、 ファイルが存在しない、もしくは何らかのエラー等で、 ファイルが正常に開けない場合のエラー処理は、 どのように判断させればよいのでしょうか? 方法をご存知の方おられましたら、参考例などご教示お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

捕まえる方法は前に回答されている方々のやり方でよいと思いますが、そのままだと実際にどんな原因で失敗しているのかわからないのが問題になりませんか? 私ならデバック時だけでもわかるように以下のような記述をします。 try { fs = gcnew FileStream(file, FileMode::Open); } catch(Exception^ e) { System::Diagnostics::Debug::WriteLine(e->Message); return false; } 以上、参考までに・・・

zigen8513
質問者

お礼

御回答ありがとうございます。 確かにエラー内容は分かったほうが良いですね。 ありがとうございました。

その他の回答 (2)

回答No.2

 こんばんは。  以下URLのExceptionクラスから、様々な例外クラスへ派生していくのですから、   http://msdn.microsoft.com/ja-jp/library/system.exception(VS.80).aspx  面倒であれば、以下の様にして、根っこを掴んでしまえば良いのでは。 try {    fs = gcnew FileStream( file, FileMode::Open ); } catch ( Exception^ ) { //問答無用に捕まえる    return FALSE; }

zigen8513
質問者

お礼

御回答ありがとうございます。 期待動作をさせることができました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

try~catchで囲んで例外を見ましょう。 http://msdn.microsoft.com/ja-jp/library/47ek66wy(VS.80).aspx

zigen8513
質問者

補足

御回答ありがとうございます。 try{    fs = gcnew FileStream( file, FileMode::Open ); } catch ( ArgumentException^ ){    return FALSE; } catch ( FileNotFoundException^ ){    return FALSE; } ・・・ のようなコードで期待動作をさせることが出来ました。 ただ、いくつかの例外を捕らえるには、 上記のようにcatch文を羅列させなければならないのでしょうか? 理想としては、正常にオープンできる以外の全ての例外の場合、 falseを返すようなコードをスマートに書きたいと思うのですが。。

関連するQ&A

  • C#テキストファイルから1バイト除去する

    数ギガのテキストファイルがあり、語尾の1バイト(EOF)を瞬時に除去したいと思います。 バイトで読んで1バイトのみ出力しないと言う方法が一番簡単ですが、時間がかかる上、巨大ファイルには向きません。 下記語尾を置換するソースを書きましたが、除去の方法がわかりません。初心者ですので、簡単にお願いします。 FileStream fs = new FileStream("test.txt", FileMode.Open); byte[] b = new byte[1]; fs.Seek(fs.Length - 1, SeekOrigin.Begin); fs.Write(b, 0, 1); fs.Close();

  • 読み取り専用ファイル FileStream でのアクセス

    VC++ .NET2003です。 読み取り専用のファイルを FileStream FileMode::Open でオープンしようとすると、 System::UnauthorizedAccessExceptionエラーが発生します。 読み取り専用でも読み込みだけならいいかと思っていたんですが、これは出来ないのでしょうか? 他に読み込みの方法があれば教えて下さい。

  • 【C++/CLI】XMLファイルに対して読み取り属性を付与する方法

    VC++2005の.NET、言語はC++/CLIにて、 既存のXMLファイルに対して読み取り属性を付与し、 ユーザーが編集をできないようにしたいのですが、 下記コードにて実行したところ、期待動作をさせることが出来ません。 おそらくどこかが明らかに間違っていると思うのですが、 何が原因か分かりません。 解決法をご存知の方おられましたら、ご教示お願いできませんでしょうか? String^ path = "C:\\test.xml"; FileAttributes atr = File::GetAttributes( path ); atr & FileAttributes::ReadOnly; File::SetAttributes( path, atr );

  • C++/CLIでのDataGridViewの使い方

    以前に質問させていただいたのですが、要点を得ていなかったため再度質問させていただいきます。 VC++2005のC++/CLIでプログラムを作成しています。 CSVファイルから内容を読み込み、DataGridVeiwに表示させたいと考えています。 CSVファイルを配列に読み込んで、表示するところまでは出来ています。 以下CSVファイルを読み込んで、コンソール出力するプログラムの一部 int i; StreamReader^ sr=gcnew StreamReader("hoge.csv"); String^ text=sr->ReadToEnd(); array<String^>^ line=text->Split(gcnew array<String^> {"\r\n", "\r", "\n"},StringSplitOptions::RemoveEmptyEntries); array<array<String^>^>^ table= gcnew array<array<String^>^>(line->Length); for (i=0; i<line->Length; i++) { table[i]=line[i]->Split(','); } for each (array<String^>^ output in table){ for(i=0; i<output->Length; i++){ Console::Write(output[i]); //行出力 } } 初歩的なことだとは思うのですが・・・ コンソール出力部分をDataGridViewで出力表示させるには どのように書けばいいでしょうか。 よろしくお願いします。

  • C++/CLIとC#の連携について

    いつも拝見させていただいております。 現在、C++/CLIとC#にて連携を行っているのですが、C++/CLIで作成したクラス配列 がC#側でどのようにすれば受け取れるのか方法がわかりません。 C++/CLIで作成しているクラス配列はSystem::Collections::Generic::Listを使用 して配列化しています。 下記がC++/CLIのソースになります。 List<testClass>^% testClass::GetList() { List<testClass>^ lpTestClassList = gcnew List<testClass>(); testClass^ lpTestClass; lpTestClass = gcnew testClass(); lpTestClassList->Add(lpWatchServiceMasterInfoWrapper); return lpTestClassList; } これをC#側で使用しようとすると下記エラーが発生します。  「この言語によってサポートされていません」 C++/CLI⇒C#間の連携ではListクラスを使用することは不可能なのでしょうか? クラスを配列にして引き渡したいだけなので、他の方法等含めて何か参考になることがありましたら ご教授ください。 よろしくお願い致します。 開発環境  C++/CLI ⇒ DLL(ネイティブなコードを参照するためのラッパー用DLL)  C# ⇒ アプリケーション

  • 【VC++2005(CLR)】読み込んだcsvファイルの一部を書き換えたい

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++2005 Express Edition CLRでプロジェクトを作成しています。 表題の件なのですが、今まで以下のようにコーディングしていましたが、 読み取りはできるものの、書き込みができません。 何か良い方法はありませんでしょうか。 希望としては、ファイルの一箇所のみを書き換えたいので、 書き込み専用のファイルを用意して、読み込みファイルを 一行、一行コピーしたくないです。   すみませんが、よろしくお願い致します。 ***(表示を考慮するため、行の先頭に全角スペースを入れています。)*** String^ strDelimiter = ","; //","で分割する array<Char>^ delimiter = strDelimiter->ToCharArray(); array<String^>^ strData; //分割後の文字の入れ物 String^ strLine; //1行分のデータ System::IO::FileStream^ fs = gcnew System::IO::FileStream  (path, System::IO::FileMode::Open, System::IO::FileAccess::ReadWrite, System::IO::FileShare::ReadWrite); System::IO::StreamReader^ sr =   gcnew System::IO::StreamReader(fs,System::Text::Encoding::Default);  while(sr->Peek() >= 0){ //csvデータ分繰り返し   strLine = sr->ReadLine(); //1行読み込み   strData = strLine->Split(delimiter); //「,」で区切って、配列に分解   if (iWorkNum == int::Parse(strData[0])){    strData[2] = strWorkTime;//書き換えたい箇所はここだけ    //※ここからの処理方法を教えて下さい。   }  } } sr->Close(); fs->Close();  

  • .NET C++/CLIのガーベジコレクションについて

    .NET C++/CLIのガーベジコレクションについて .NET C++/CLIで、マネージピープの配列をネイティブDLLにポインタ引数として渡す動作で、 配列が正常に渡っていることは確認したのですが、ネイティブDLL側で配列の処理をしている最中に、 ガーベジコレクションが起こり、誤動作することはあるのでしょうか。 ちなみに、マーシャリングは以下のように行いました。 // マネージ側コード [DllImport("native.dll")] void ArraySet( [MarshalAs(UnmanagedType::LPArray)] array <int> ^ Data ); array <int> ^ Data = gcnew array <int>(64); ArraySet( Data ); // この中で配列の処理中にガーベジコレクションが起こると誤動作?

  • C++/CLIのクラスについて

    現在, VC++2008のC++/CLIを用いてプラグラムを作成しています。 値を与えると,計算した値を返すクラスを一回の処理の何度も使用しています。 Keisa^ kei = gcnew Keisa; kekka1 = keisan->exec(1); kekka2 = keisan->exec(2); kekka3 = keisan->exec(3); delete kei; ///上記のkekkaを使用した処理/// kekka1=0; kekka2=0; kekka3=0; 上記のように書いて,実行すると,  kekka2にはkekka1 + kekka2を合計した値 kekka3にはkekka1 + kekka2 + kekka3を合計した値 のように,積算した値になってしまいます。(しかもなぜか,releaseフォルダ内の.exeファイルから実行した場合のみです...) クラスを使用した後の後処理に問題があるのかもしれませんが,知識がなくわかりません。 お分かりの方がいらっしゃいましたら,ご教授お願い致します。

  • 【C++/CLI】コンボボックスの値を取得したい

    VC++2005の.NETで言語はC++/CLIにてアプリを作成しています。 コンボボックスに下記値が挿入されています。 aaa bbb インデックス「1」を指定して、「bbb」の文字列を、 String型で取得したいのですが、方法が分かりません。 素人ながら、下記コードも試してみましたが、検討違いでした。 String^ str = this->cmbTest->GetItemText( 1 ); 初歩的な質問で申し訳ないですが、 方法をご存知の方、ご教示お願い致します。

  • [C#]FTPでの複数のファイルのアップロード

    ネットで調べたところ1つのファイルであれば、 下記の記述でアップロードできることがわかったのですが、 別々のフォルダにあるにファイルを複数同時にアップロードするプログラムがわかりません。 どなたかご教示ください。よろしくお願いいたします。 using System; using System.Net; using System.IO; class FtpWebPut {  static void Main()  {   string uri = "ftp://servername/Upload/secret.png";   string myFile = "tmp.png";   WebRequest req = WebRequest.Create(uri);   req.Credentials = new NetworkCredential("user01", "mypassword");   req.Method = WebRequestMethods.Ftp.UploadFile;   using (Stream st = req.GetRequestStream())   using (FileStream fs = new FileStream(myFile, FileMode.Open))   {    Byte[] buf = new Byte[1024];    int count = 0;    do    {     count = fs.Read(buf, 0, buf.Length);     st.Write(buf, 0, count);    }    while (count != 0);   }  } }

専門家に質問してみよう