エディットボックスに入力したファイルを取得したい。

解決


ななし  2008-07-04 05:02:07  No: 68657

ダイアログを表示し、エディットボックスにファイル名を入力してもらい、
そのファイルを開き、ファイルサイズを取得したいと考えていたのですが詰まってしまいました。

//グローバル変数
//格納用
char edit_str[256];

// ダイアログボックスのプロシージャ
LRESULT CALLBACK MyDlgProc( HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
{

    switch( msg ){
        case WM_INITDIALOG:
            SetDlgItemText( hDlgWnd, IDC_EDIT1, (LPTSTR)edit_str );   // エディトボックスに文字列を表示
            return TRUE;
        case WM_COMMAND:
            switch( LOWORD( wp ) ){
                case IDOK:      //OKボタンを押したとき
                    // エディットボックスに入力された文字列を取得
                    GetDlgItemText( hDlgWnd, IDC_EDIT1, (LPTSTR)edit_str, sizeof(edit_str) );
}

int file()
{
   // ファイルポインタ
   FILE* fp = fopen( (char*)edit_str, "rb" );

    //fileがなければ
    if( !fp ){}

    //filesizeを取得
    int size = fseek(fp, 0, SEEK_END);
    long insize = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    return 0;
}

ファイルは実行ファイルのあるフォルダにあるものを指定します。
よくわからないのですが、なぜかfileopen()が成功するのとしないものがあります。
あとfileopen()が成功したものもその後でfilesizeを取得しようとしても
ftell()が0を返してしまい正しい値が
取得できません。(そのファイルは空ではないです。)

どうぞよろしくお願い致します。


かもねぎ  2008-07-04 06:36:02  No: 68658

// 参考になりますか?
/*
    ReadFromFile.cpp
    XP sp3 , VC2005
    /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" 
    /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W4 /nologo 
    /c /Wp64 /ZI /TP /errorReport:prompt
*/

#include     <windows.h>

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int ) 
{
    HANDLE  hFile ;
    DWORD   dwReadSize ;
    CHAR    strFileA[ 1024 ] ;
    DWORD   dwSize ;

        /* 読み取るファイル名を指定する */

    LPCTSTR lpFilename = TEXT( "Book1.txt" ) ;

        /* 読み取りモードでファイルを開く */

    hFile = CreateFile( lpFilename, GENERIC_READ , 0 , NULL ,
    OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ) ;

        /* ファイルが開けない場合の処理 */

    if (hFile == INVALID_HANDLE_VALUE) 
    {
        MessageBox( NULL, TEXT( "ファイルが開けません" ), NULL, MB_OK ) ;
        return -1 ;
    }

        /* ファイルサイズを取得する */

    dwSize = GetFileSize( hFile, NULL ) ;

        /* ファイルの読み込み位置を指定する */

    SetFilePointer( hFile, 0, 0, FILE_BEGIN ) ;

        /* ファイルをバイト単位で読み込む */

    ReadFile( hFile, strFileA, dwSize, &dwReadSize, NULL ) ;

        /* 読み込んだ文字列に終端文字を追加する */

    strFileA[ dwReadSize ] = '\0' ;

        /* 文字列は現在マルチバイト文字列(非Unicode)なので
           明示的にMessageBoxAを呼び出せば表示できる */

    MessageBoxA( NULL, strFileA, "結果", MB_OK ) ;

    /**************************************************************************
        文字列をUnicodeへ変換する
     **************************************************************************/

        /* ワイドキャラ用必要バッファ要素数を取得 */

    int nLen = MultiByteToWideChar( CP_ACP, 0, strFileA, -1, NULL, NULL ) ;

        /* 変換後の文字列格納用バッファを動的確保 */

    LPWSTR strFileW = new WCHAR[ nLen ] ;

        /* 文字列をUNICODEに変換する */

    MultiByteToWideChar( CP_ACP, 0, strFileA, -1, strFileW, nLen ) ;

        /* UNICODE文字列として表示する */

    MessageBox( NULL, strFileW, TEXT("Unicode"), 0 ) ;
  
        /* メモリを解放 */

    delete strFileW ;

        /* ファイルハンドルを閉じる */

    CloseHandle( hFile ) ;

    return 0 ;
}


wclrp ( 'o')  2008-07-04 07:17:13  No: 68659

この件とは関係ないかもしれないが
相対パスに使われるカレントディレクトリは
実行ファイルのあるフォルダとは違うものにできるのですよ。

念のため


ななし  2008-07-04 22:47:37  No: 68660

かもねぎさん、wclrp ( 'o')さん、解答ありがとうございます。

wclrp ( 'o')さんの発言で、パスについてが怪しいかもと思い、
パスの指定を絶対パス("c:\\test.txt")にしてやってみたところ、ファイルが正しく開き、
ファイルサイズも正しく得ることができました。
相対パスについてですが、今までは実行ファイルと同じフォルダにテスト用のファイル(test.txt)を置いて、
エディットボックスからは("test.txt")と入力し、失敗していたのですが、
実行ファイルと同じフォルダの一つ上の階層に("test.txt")を置き、同じように入力したところ、正しくファイルが
オープンされ、サイズも取得できました。

かもねぎさんの例示したやり方でも最初上手く行かなかったのですが、パスの指定を正しくしたら同じように上手くできました。

相対パスで読み書きしたいファイルを指定するには実行ファイルと同じフォルダに置くものと思っておりました...
パスについてちょっと分からなくなってしまったので一度ちゃんと調べようと思います。
質問ついては解決とさせていただきます。
ヒントを下さったお二方、どうもありがとうございます。


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

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






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