質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

2313閲覧

C言語 ファイル・ディレクトリ探索 ディレクトリごとの表示

shunxile

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/04/22 00:24

編集2021/04/22 02:16

前提・実現したいこと

C言語を学習し始めたC言語初心者です。
C言語でファイル・ディレクトリの探索をしてその結果をCSV出力するプログラムを作成中です。
現状ディレクトリごとのファイル・サブディレクトリを取得して
ファイルならファイルサイズも一緒にCSV出力はできているのですが
1箇所サブディレクトリが2つあるところでインデントのつけ方を直したいのですが
どのように修正すればよいのか分からず悩んでいるので教えていただきたいです。

発生している問題・エラーメッセージ

現状
https://gyazo.com/5349177b78238625a22267c3ed684772
理想としては上記画像ファイルの『Sample4』とt『Sample5』が
1列ずつ左にセルを移動した形にしたいです。
理想(出力後セルを自分で移動させています)
https://gyazo.com/4a60c885568708a32ec5ceb8082168db

該当のソースコード

C

1#define _CRT_SECURE_NO_WARNINGS 2 3#include <Windows.h> 4#include <stdio.h> 5#include <locale.h> 6#include <stdlib.h> 7#include <io.h> 8 9void FileSearch(const wchar_t* dirpath); 10FILE* files; 11fpos_t size = 0; 12int c = 0,i = 0; 13 14int main(void) 15{ 16 // 表示する 17 FileSearch(L"探索したいディレクトリの場所"); 18 return 0; 19} 20 21 22// 引数として渡したディレクトリ以下のディレクトリとファイルを全て表示する 23void FileSearch(const wchar_t *dirpath) 24{ 25 HANDLE hFind; // ハンドル 26 WIN32_FIND_DATA win32fd; // ファイル情報 27 28 // ディレクトリにワイルドカードを追加(...\*となる) 29 wchar_t dirwildpath[1024]; // ファイル名も含んだパス 30 wcscpy(dirwildpath, dirpath); // ファイルパスをコピー 31 wcscat(dirwildpath, L"*"); // ワイルドカードを追加 32 33 // ハンドルを取得しファイル情報を保存する 34 hFind = FindFirstFile(dirwildpath, &win32fd); 35 36 // 何も見つからなかったとき 37 if (hFind == INVALID_HANDLE_VALUE) { 38 FindClose(hFind); 39 return; 40 } 41 42 while (FindNextFile(hFind, &win32fd)) 43 { 44 // カレントディレクトリと親ディレクトリのとき 45 if ((wcscmp(win32fd.cFileName, L".") == 0) 46 || (wcscmp(win32fd.cFileName, L"..") == 0) || (wcscmp(win32fd.cFileName, L"desktop.ini") == 0)) 47 { 48 // 何もしない 49 } 50 51 // ディレクトリのときの処理 52 else if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 53 { 54   files = fopen("output.csv", "a"); 55 for (i = 0; i < c; i++) 56 { 57 fprintf(files,","); 58 } 59 fprintf(files,"%ls\n",win32fd.cFileName); 60 c++; 61 fclose(files); 62 63 // 文字列バッファを更新 64 wchar_t dir_buf[1024]; 65 wcscpy(dir_buf, dirpath); // ディレクトリをコピーする 66 wcscat(dir_buf, win32fd.cFileName); 67 wcscat(dir_buf, L"\"); 68 69 // 再帰する 70 FileSearch(dir_buf); 71 } else 72 { // ファイルのとき 73 files = fopen("output.csv", "a"); 74 fseek(files, 0, SEEK_END); 75 fgetpos(files, &size); 76 for (i = 0; i < c; i++) 77 { 78 fprintf(files, ","); 79 } 80 fprintf(files, "%ls,%ld[byte]\n", win32fd.cFileName, size); 81 fclose(files); 82 } 83 } 84 85 FindClose(hFind); 86}

試したこと

FindNextFileで親ディレクトリに移動したらデクリメントを設けようと思ったのですが
条件文などが書けず断念しました。

補足情報(FW/ツールのバージョンなど)

Windows10・VisualStudio

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これでいい?

C

1#define _CRT_SECURE_NO_WARNINGS 2 3#include <Windows.h> 4#include <stdio.h> 5#include <locale.h> 6#include <stdlib.h> 7#include <io.h> 8 9void FileSearch(const wchar_t* dirpath, int depth); 10 11int main(void) 12{ 13 // 表示する 14 FileSearch(L".\", 0); 15 return 0; 16} 17 18 19// 引数として渡したディレクトリ以下のディレクトリとファイルを全て表示する 20void FileSearch(const wchar_t *dirpath, int depth) 21{ 22 FILE* files; 23 fpos_t size = 0; 24 int i = 0; 25 26 HANDLE hFind; // ハンドル 27 WIN32_FIND_DATA win32fd; // ファイル情報 28 29 // ディレクトリにワイルドカードを追加(...\*となる) 30 wchar_t dirwildpath[1024]; // ファイル名も含んだパス 31 wcscpy(dirwildpath, dirpath); // ファイルパスをコピー 32 wcscat(dirwildpath, L"*"); // ワイルドカードを追加 33 34 // ハンドルを取得しファイル情報を保存する 35 hFind = FindFirstFile(dirwildpath, &win32fd); 36 37 // 何も見つからなかったとき 38 if (hFind == INVALID_HANDLE_VALUE) { 39 FindClose(hFind); 40 return; 41 } 42 43 while (FindNextFile(hFind, &win32fd)) 44 { 45 // カレントディレクトリと親ディレクトリのとき 46 if ((wcscmp(win32fd.cFileName, L".") == 0) 47 || (wcscmp(win32fd.cFileName, L"..") == 0) || (wcscmp(win32fd.cFileName, L"desktop.ini") == 0)) 48 { 49 // 何もしない 50 } 51 52 // ディレクトリのときの処理 53 else if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 54 { 55 files = fopen("output.csv", "a"); 56 for (i = 0; i < depth; i++) 57 { 58 fprintf(files,","); 59 } 60 fprintf(files,"%ls\n",win32fd.cFileName); 61 fclose(files); 62 63 // 文字列バッファを更新 64 wchar_t dir_buf[1024]; 65 wcscpy(dir_buf, dirpath); // ディレクトリをコピーする 66 wcscat(dir_buf, win32fd.cFileName); 67 wcscat(dir_buf, L"\"); 68 69 // 再帰する 70 FileSearch(dir_buf, depth+1); 71 } else 72 { // ファイルのとき 73 files = fopen("output.csv", "a"); 74 fseek(files, 0, SEEK_END); 75 fgetpos(files, &size); 76 for (i = 0; i < depth; i++) 77 { 78 fprintf(files, ","); 79 } 80 fprintf(files, "%ls,%ld[byte]\n", win32fd.cFileName, size); 81 fclose(files); 82 } 83 } 84 85 FindClose(hFind); 86}

投稿2021/04/22 01:48

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunxile

2021/04/22 02:04

>>epistemeさん ありがとうございます! 期待してた結果が得られました。コード見て勉強し直してみます
episteme

2021/04/22 02:06

先行する , の数すなわち ディレクトリの深さ "もろとも"再帰させりゃえぇってことです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問