スナックelve 本店

バツイチ40代女の日記です

Cのことはすっかり忘れてしまった(恋愛風

あなたと過ごした5年弱。私はあなた(C言語)のおかげで生きていけた。
確かにその時間はあったはずなのに・・・。

今はもう、どんな風にあなたを呼んでいたのかすら思い出せない。


C言語かC++でフォルダごとのファイル数えよう、と思って手が止まった。
あれってどうすんだっけ?wwww 一応、それで飯食ってたんだがなぁ。
はてさて、開発環境からしてないぞ(;´Д`)

なんか Visual Studio でもなんも弄ってないブランクの状態でコンパイルされない(;´Д`)
windows SDK入れろってことらしい?

Windows SDK アーカイブ - Windows アプリ開発

ソリューションの再ターゲットとやらでハローワールド成功。良かったー。

C言語でフォルダ内のファイル数とファイル名を取得 - Qiita
のコメント欄を見る
FindFirstFile 関数
を使うらしい。

次のサンプルコードは、FindFirstFile の最も簡単な使い方を示します。

https://msdn.microsoft.com/ja-jp/library/cc429233.aspx
#define _WIN32_WINNT 0x0400
#include "windows.h"
int
main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;
  printf ("Target file is %s.\n", argv[1]);
  hFind = FindFirstFile(argv[1], &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE) {
    printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
  } else {
    printf ("The first file found is %s\n", FindFileData.cFileName);
    FindClose(hFind);
  }
  return (0);
}

うむ、動かぬ。でたなワイド文字列(?)。もう忘れたぞ。

プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]

https://oshiete.goo.ne.jp/qa/2236318.html

で回避。

うーむ、思い出せないwww

// Ctest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
extern long Directory(char path[]);
int flg;
int

main(int argc, char *argv[])

{
	flg = 0;

	long f = Directory(argv[1]);
	if (f > 0) { 
		printf("%s    %d", argv[1], f); 
	}

	return (0);

}

long Directory(char path[])
{
	char subpath[_MAX_PATH];
	char temp[_MAX_PATH];
	WIN32_FIND_DATA lp;
	long f = 0;
	strcpy(temp, path);
	HANDLE h = FindFirstFile(temp, &lp);

	temp[strlen(temp) - 1] = '\0';//*を消している
	do
	{
		if ((lp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			&& strcmp(lp.cFileName, "..") != 0 && strcmp(lp.cFileName, ".") != 0)
		{
			//subpathでディレクトリのフルパスが分かる
			wsprintf(subpath, "%s%s\\*", temp, lp.cFileName);
			printf("%s", subpath);
			flg = 1;
			Directory(subpath);
		}
		if ((lp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
		{
			f++;
		}
	} while (FindNextFile(h, &lp));
	if (flg == 1) {
		printf("    %d\n", f);
		flg = 0;
	}
	FindClose(h);
	return f;
}

参考にしたのは(というかほぼそのままだけどw)
指定したディレクトリ以下のファイルを列挙

出力

>Ctest c:\test\*
c:\test\test2\*    2
c:\test\*    3