2011-05-12 250 views
4

ファイルをディスクに保存するための[名前を付けて保存]ボタンがあるMFC C++アプリケーションを作成しています。私はファイルの上書きのために追加の検証を追加しようとしています(同じファイル名のファイルが存在する場合、古いファイルを上書きするかどうかを問い合わせる必要があります)。私は以下のコードでこれを試しましたが、実際には動作しません。 MessageBoxでNoをクリックすると、Save Asファイルダイアログが再び開くはずですが、2つのエラーが表示されます。最初はDebug assertion failed、もう1つはEncountered an improper argumentです。これをもっとうまくやるべきでしょうか?これは、コードである:MFCファイルを保存ダイアログ

char strFilter[] = { "Text Files (*.txt)|*.txt|" }; 

    CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 

    while(true) 
    { 
     if(FileDlg.DoModal() == IDOK) // this is the line which gives the errors 
     { 
      agendaName = FileDlg.GetFileName(); //filename 
      agendaPath = FileDlg.GetFolderPath(); //filepath (folders) 

      if(model->agendaExists(CSToString(agendaPath+TEXT("\\")+agendaName))) // there is another file called the same way 
      { 
       if(MessageBox(TEXT("A file with the specified name already exists. Overwrite?"), TEXT("File exists"), MB_YESNO) != 6) // user clicked NO (do not overwrite file) 
       { 
        continue; 
       } 

      } 

      model->sendToFile(CSToString(agendaPath+TEXT("\\")+agendaName)); // the file is unique so the agenda named agendaName found at path agendaPath is saved 
      return; 
     } 
    } 

エラーがwhile介してライン7上にのみ第二のループで発生することが言及されるべきです。

答えて

8

ファイルが存在する場合、CFileDialogはそれ自身を検出して、ユーザーに上書きを促します。

explicit CFileDialog(
    BOOL bOpenFileDialog, 
    LPCTSTR lpszDefExt = NULL, 
    LPCTSTR lpszFileName = NULL, 
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
    LPCTSTR lpszFilter = NULL, 
    CWnd* pParentWnd = NULL, 
    DWORD dwSize = 0 
); 

フラグにOFN_OVERWRITEPROMPTを渡すだけです。

あなたの問題については、デバッガで実行し、そのアサーションを取得したら、再試行ボタンを押して問題の発生場所を確認します(おそらくコールスタックも調べる必要があります)。たぶん、あなたは、whileループでこれを入れて試してみてください:(whileループの最初の行など)、whileループ内のライン

CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 

下回るなど、

CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 
1

てみてください。このラインはあなたの中にwhileループの外にありますコード

2

コンストラクタにはOFN_OVERWRITEPROMPTフラグを使用する必要があります。このフラグは、通常、デフォルトのフラグの1つですが、フラグを0に設定しているため、次のようになります。

これは動作するはずです。ちなみに、GetPathName()は選択したファイルへの完全なパスを取得するので、フォルダとファイル名を2ステップで取得する必要はありません。

+0

私は知っていますが、ファイル名とファイルパスの両方が必要です。上記は、うまくいきました。ありがとう! –

関連する問題