トップページ > 記事閲覧
FileRead_findCloseで例外が発生してしまう
名前:アイス 日時: 2020/03/25 23:00

初めまして. _ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4226 (最初の文字をhにしてください) こちらの回答にあったコードを実際に動かそうとしてみたのですが,FileRead_findClose( FindHandle ) ;の部分でアクセス違反が発生してしまいました。 これはどのような場合に起こる例外スローなのでしょうか?
メンテ

Page: 1 |

Re: FileRead_findCloseで例外が発生してしまう ( No.1 )
名前:管理人 日時:2020/03/25 23:51

すみません、dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4226 のコードでは FileRead_findClose を呼ぶ箇所を間違っていましたので修正しました 修正前は // 検索開始、最初のファイルの情報を取得 // ( *.* や ???.* などのシンプルなワイルドカード表現に対応しています ) FindHandle = FileRead_findFirst( "D:\\File\\*", &FileInfo ) ; // ファイルが見つかった場合のみ分岐の中を実行 if( FindHandle != ( DWORD_PTR )-1 ) { y = 0 ; do { // ファイル名とフォルダかファイルかの情報を描画 DrawFormatString( 0, y, GetColor( 255,255,255 ), "%s %s", FileInfo.Name, FileInfo.DirFlag ? "フォルダ" : "ファイル" ) ; // 描画y座標をずらす y += 16 ; // 検索に引っかかる次のファイルの情報を取得、無かったらループを抜ける }while( FileRead_findNext( FindHandle, &FileInfo ) >= 0 ) ; } // 検索ハンドルの後始末 FileRead_findClose( FindHandle ) ; となっていましたが、正しくは // 検索開始、最初のファイルの情報を取得 // ( *.* や ???.* などのシンプルなワイルドカード表現に対応しています ) FindHandle = FileRead_findFirst( "D:\\File\\*", &FileInfo ) ; // ファイルが見つかった場合のみ分岐の中を実行 if( FindHandle != ( DWORD_PTR )-1 ) { y = 0 ; do { // ファイル名とフォルダかファイルかの情報を描画 DrawFormatString( 0, y, GetColor( 255,255,255 ), "%s %s", FileInfo.Name, FileInfo.DirFlag ? "フォルダ" : "ファイル" ) ; // 描画y座標をずらす y += 16 ; // 検索に引っかかる次のファイルの情報を取得、無かったらループを抜ける }while( FileRead_findNext( FindHandle, &FileInfo ) >= 0 ) ; // 検索ハンドルの後始末 FileRead_findClose( FindHandle ) ; } となります 上記コードの検索対象である D:\File のフォルダが無い場合、FileRead_findFirst は失敗して FindHandle には ( DWORD_PTR )-1 が代入される( FileRead_findFirst の戻り値が ( DWORD_PTR )-1 になる )のですが、 修正前のコードでは FileRead_findFirst が失敗した場合も FileRead_findClose を呼んでしまっていました FileRead_findClose は無効なハンドルが渡されるとアクセス違反が発生してしまうので FileRead_findFirst が失敗して返された ( DWORD_PTR )-1 ( ←ハンドルとしては無効な値 )を FindRead_findClose に渡して呼びだしたことによりアクセス違反が発生した、という形です
メンテ
Re: FileRead_findCloseで例外が発生してしまう ( No.2 )
名前:アイス 日時:2020/03/26 00:11

迅速な対応ありがとうございます! 原因がハッキリわかってよかったです 無事ファイル・フォルダ名を取得することができたのですが,表示されたファイル一覧の1つ目が「. フォルダ」2つ目が「.. フォルダ」となっていました こちらの原因は何かわかりますでしょうか… 質問続きで申し訳ございません.
メンテ
Re: FileRead_findCloseで例外が発生してしまう ( No.3 )
名前:kanamaru 日時:2020/03/26 07:36

それは無視していいです。 何なら処理入れて一覧から外してもいいです。 説明が難しいですが、一覧に含める必要がないのが含まれている認識でも大丈夫かと。 管理人さん、含まないように修正お願いします。
メンテ
Re: FileRead_findCloseで例外が発生してしまう ( No.4 )
名前:アイス 日時:2020/03/26 11:54

仕様で必ず2つ出てくると捉えてよろしいでしょうか? 説明ありがとうございます.
メンテ
Re: FileRead_findCloseで例外が発生してしまう ( No.5 )
名前:管理人 日時:2020/03/28 00:09

> アイスさん 『.』は検索対象自身のフォルダを示しています 『..』は検索対象の一つ上の( 一つ階層が浅い )フォルダを示しています 相対パス表記には『..』はよく使う表現です たとえば C:\Folder\A がカレントフォルダの場合で C:\Folder\B\File1.txt というファイルを相対パスで表記する場合は ..\B\File1.txt とします、もう一つ応用で、例えばカレントフォルダは先程と同じく C:\Folder\A で、 C:\TempFolder\FileC.txt という、二つ上の( 二つ浅い階層の )フォルダまで遡らなければならないファイルを指定する場合は ..\..\TempFolder\FileC.txt と表記します( 『..\』一つにつき、一つ上の( 一つ浅い階層の )フォルダを指定したことになります ) 同じように、『.』は自分自身のフォルダを示しますので 先程と同じように C:\Folder\A がカレントフォルダの場合で C:\Folder\A\File2.txt というファイルを相対パスで指定する場合は通常は File2.txt と表記しますが .\File2.txt と表記しても正しいことになります ( 『.\』はあっても無くても良い為、相対パス表記では『..』はよく使いますが、『.』は滅多に使いません… ) > 仕様で必ず2つ出てくると捉えてよろしいでしょうか? いえ、『.』は必ずありますが、検索対象のフォルダが C:\ など 『一つ上の( 一つ浅い階層の )フォルダが存在しないフォルダ』 の場合は『..』はありませんので 『『.』は必ず出てくるけど、『..』は検索対象のフォルダが深さ0のフォルダ( ルートフォルダ )の場合は出ない』 となります > kanamaruさん 『.』は省いても良さそうですが、『..』はファイラーなどの処理を組む場合は 「『..』が選択されたら一つ上のフォルダに移動する」といった処理に使用できるので、 『.』『..』を省く仕様変更はとりあえずしない方向にしたいと思います
メンテ
Re: FileRead_findCloseで例外が発生してしまう ( No.6 )
名前:アイス 日時:2020/03/28 01:18

詳しくありがとうございます 処理に使う場合があるものを入れていたんですね
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存