ページ 11

C言語でディレクトリを扱う

Posted: 2011年6月29日(水) 17:05
by COFE
いきなり本題ですが例えばC:\work\ディレクトリに
kyouto.png
index.html
soccer.wmv
main.h
というファイルがあったとします
コレをC言語のプログラムで把握するにはどうすればいいのでしょうか?
具体的には
char *dirfile[128];
dirfile[0]="kyouto.png";
dirfile[1]="index.html";
dirfile[2]="soccer.wmv";
dirfile[3]="main.h";
と配列にこんな感じで格納してもらいたいです(これはソースに直書きしているのでコンパイル後に修正するのが不可能ですけど)
私なりにはファイルの入出力の時みたいに

コード:

main(){
	DIR *dp
	opendir("C:\work",r);
}
こんな感じにするのかなと思ったのですが、本当にこうやるのは可能ですか?

Re: C言語でディレクトリを扱う

Posted: 2011年6月29日(水) 17:19
by shiro4ao
WindowsAPIですがFindFirstFileという関数はいかかでしょうか?
詳細:http://msdn.microsoft.com/ja-jp/library/cc429233.aspx

Re: C言語でディレクトリを扱う

Posted: 2011年6月29日(水) 17:36
by non
環境によって,使えるものが違いますから,環境を書きましょう。
opendir って書いてあるからUNIXですかね?

Re: C言語でディレクトリを扱う

Posted: 2011年6月29日(水) 20:32
by shiro4ao
てっきりWindowsだと思ってしまいました。
申し訳ないです。

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 08:32
by さかまき
>本当にこうやるのは可能ですか?

linuxなら、opendir(DIR *dir),readdir(DIR *dir),closedir(DIR *dir)
( dirent.h をインクルードします。)

opendir("C:\work",r); だからこれは×ですね

コード:

#include <dirent.h>
func()
{
DIR *dir;
struct dirent *dp;

	dir = opendir("/work");

	while(( dp = readdir(dir)) != NULL)
	{
		// dp->d_name がファイルパス名
	}
	closedir(dir);
}

みたいなかんじ。

ただ
>C:\work\ディレクトリに
ですから、WINDOWSかも。環境は書かないとね

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 13:01
by COFE
すいません、色々混乱させてしまったみたいですが環境はwindowsです
opendirっていう関数がほんとうにあるとは知らず適当に書いたんです
windows環境で上に示したことをするにはどうすればいいでしょうか?

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 13:23
by softya(ソフト屋)
C言語の標準ライブラリには有りませんので、shiro4aoさんの書いたとおりWin32API(WindowsAPI)を使います。

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 15:50
by COFE
shiro4ao さんが書きました:WindowsAPIですがFindFirstFileという関数はいかかでしょうか?
詳細:http://msdn.microsoft.com/ja-jp/library/cc429233.aspx
softya(ソフト屋) さんが書きました:C言語の標準ライブラリには有りませんので、shiro4aoさんの書いたとおりWin32API(WindowsAPI)を使います。
うーん、やっぱりWIN32API使わなきゃいけませんか……
fopenとかはUNIXと互換性があるのにディレクトリはダメってヒドイですね(windowsのこっちが文句行っても仕方ないか)
それで考えたんですけどPerlでディレクトリを開く関数ってありますか?
C言語ではなくPerlでお願いします

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 18:07
by softya(ソフト屋)
それこそPerlならopendirがあるはずですが、LinuxとWinで同じ動作するかは覚えてません。Win32APIを避けるってことは両方で使いたいんですよね?

>fopenとかはUNIXと互換性があるのにディレクトリはダメってヒドイですね(windowsのこっちが文句行っても仕方ないか)
opendirはC言語では非標準関数ですので、あったらラッキー程度に考えてください。

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 18:14
by ISLe
COFE さんが書きました:fopenとかはUNIXと互換性があるのにディレクトリはダメってヒドイですね(windowsのこっちが文句行っても仕方ないか)
ファイルシステムが違うのだから仕方ありません。
標準ライブラリは互換性のある部分だけを持ってきてるわけですから。
COFE さんが書きました:それで考えたんですけどPerlでディレクトリを開く関数ってありますか?
C言語ではなくPerlでお願いします

コード:

opendir DIR, 'C:\\work' or die;
while ($dir = readdir DIR) {
	print "$dir\n";
}
closedir DIR;
#ActivePerlで動作確認しました。

(追記)
ウインドウズでもgccでdirent.h(の関数)が使えますね。
#Cygwin版で確認しました。

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 22:41
by COFE
出来ました
ありがとうございます

Re: C言語でディレクトリを扱う

Posted: 2011年6月30日(木) 22:42
by COFE
解決付け忘れてました
やっぱりPerlは構文が楽ですね
教えてくださったみなさんありがとうございました