
C言語でファイル一覧を読み込む関数を使いたいのですが、
Linuxとwindowsで共通になるようにラッピングAPIを作りたいです。
環境はLinuxはGCC、windowsはVC++6です。
my_opendir()、my_readdir()、my_closedir()というAPIとして、
Linux側はそれぞれopendir()、readdir()、closedir()を
内部で呼べばいいですが、問題はwindowsです。
my_opendir()内部で_findfirst()を呼んでしまうと、
一個目のファイルが読まれてしまいます。
グローバル変数に読まれたデータを保存して、
my_readdir()時の最初の時に読み出す方法も考えたのですが、
これだとリエントラントになりません。
何かいい方法はないでしょうか?
No.2ベストアンサー
- 回答日時:
my_opendirの返す値を構造体にして、その中にデータを保存すればいいでしょう。
struct my_opendir_data {
long handle; /*_findfirstの返したハンドル*/
char *firstfile; /* _findfirstが返した最初のファイル名*/
};
struct my_opendir_data *my_findfirst(const char *dir)
{
(略)
long handle = _findfist(filename, &fileinfo);
struct my_opendir_data *data = malloc(sizeof(*data));
data.handle = handle;
data.firstfile = malloc(strlen(fileinfo.name)+1);
strcpy(data.firstfile, fileinfo.name);
return data;
}
BOOL my_readdir(char *dst, struct my_opendir_data *data)
{
if (data->firstfile) {
strcpy(dst, data->firstfile);
free(data->firstfile);
data->firstfile = NULL;
return TRUE;
} else {
_findnextの呼び出し
}
}
BOOL my_closedir(struct my_opendir_data *data)
{
_findclose(data->handle);
free(data->firstfile);
free(data);
}
こんな感じで。
なるほど。
構造体の中にmallocした領域のポインタを保存しておくのですね。
正直、引数をopendir()/readdir()/closedir()と合わせたいのと
mallocをできるだけ使いたくなかったので、
あんまり考えないで居たのですが、
結構すっきりするものですね。
ありがとうございました。
No.3
- 回答日時:
ANo.1です。
> 結局、staticな変数を使うのでリエントラントにならないなぁと。
my_opendir()の返値を構造体ポインタにして構造体に必要なデータを含ませればstatic変数は必要なくなるよ。構造体はmallocで確保するか、面倒なら引数で受け取るようにしても良い。
これは一般的なリエントラント化の手法なのでちゃんと理解しておいた方が良いよ。
No.1
- 回答日時:
my_opendir()は何を返すの?
opendir()から類推すると何らかの構造体へのポインタを返すでしょうから、この構造体に必要なデータを保持できるようにすれば良いでしょう。
_findfirst()の呼び出しはmy_opendir()では行わず、初めてmy_readdir()が呼び出された時点で行うことも可能だと思います。
この回答への補足
お礼のところで間違いが一点。
×Linuxならdirent *でwindowsならlongとかかなぁ
○LinuxならDIR *でwindowsならlongとかかなぁ
結局、staticな変数を使うのでリエントラントにならないなぁと。
割り込み禁止にすればいい話なんですけど。
my_opendir()の返り値はあんまり考えてなかったです。
MY_DIRHANDLE型とか定義して、Linuxならdirent *でwindowsならlongとかかなぁ。
一番いいのは_findnext()で取れるファイル名を一個戻せれば一番なんですけど・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- UNIX・Linux fessカスタマイズ 1 2022/09/27 17:29
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- UNIX・Linux Linuxサーバーのパーティション・ディレクトリの推奨見積もりについて 3 2023/01/17 00:46
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- Access(アクセス) Access2016のExcelインポートの機能のことで教えてください 1 2022/09/11 14:58
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
int型(2バイト)データの分割
-
aliasesファイルを検索したいの...
-
&ReadParseでフォームの値が取...
-
'dataType' 引数を Null にする...
-
C#でのswitch文
-
エクセルVBA:日付データの変換...
-
c言語の多次元配列で1から100ま...
-
stable diffusionのエラー
-
正規表現(置換え)について
-
pythonでDBのカラム名で取得し...
-
VisualBasicでレジストリキーの...
-
エクセルVBAで16の16乗を正確に...
-
perlチェックでエラーが出て困...
-
Perlでのテキスト変換方法に関して
-
音声波形の数値表示用のソフト
-
【Excel VBA】10進数を2進数に...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
html→aspxへのタグ変換方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
stable diffusionのエラー
-
エクセルVBA:日付データの変換...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
C#でのswitch文
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
printfの%eで指数部分の桁数を...
-
ポインター引数の関数でコンパ...
-
CreateProcessでの環境変数の設...
-
C言語でのLinuxとwindows共通の...
-
C言語でPBYTE型からDOUBLE型へ変換
-
pythonでDBのカラム名で取得し...
-
エクセルVBAで16の16乗を正確に...
-
FFTがうまくできない
-
ビットデータのチェック方法
-
参照渡しの速度について
-
POSTで配列のデータを渡す方法は?
-
PINVOKEで構造体配列をマーシャ...
おすすめ情報