Создать текстовый файл, в который поместить информацию о списке подпапок текущей папки - C (СИ)
Формулировка задачи:
Добрый день, есть задание, но нет идей с помощью каких инструментов его реализовывать. Не могли бы вы направить, указать что изучить, какими операторами воспользоваться?
В текущей папке создать папки с именами, указанными в качестве параметров командной строки. Создать текстовый файл, в который поместить информацию о списке подпапок текущей папки.
P.S. Задание относится к теме операций ввода-вывода, но пока все что я нашел, это работа с файлами, о том, как работать с папками информация не попадалась.
Ввысь
Решение задачи: «Создать текстовый файл, в который поместить информацию о списке подпапок текущей папки»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#ifdef UNIX
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#elif WINDOWS
#include <windows.h>
#endif
#define OUTPUT_FILE_NAME "directories.txt"
static void CreateDirectories(int argc, char* argv[]);
static void PrintDataToFile(const char* const fileName);
int main(int argc, char* argv[])
{
CreateDirectories(argc, argv);
PrintDataToFile(OUTPUT_FILE_NAME);
return 0;
}
static void CreateDirectories(int argc, char* argv[])
{
#ifdef UNIX
int i = 0;
int errorCode = 0;
int mode = 0700;
struct stat st = {0};
for(i = 1; i < argc; i++)
{
if (!(stat(argv[i], &st) != -1))
{
errorCode = mkdir(argv[i], mode);
if (errorCode != 0)
{
printf("Error: failed to create directory '%s' (%d, %s)\n", argv[i],
errorCode, strerror(errno));
}
else
{
printf("Created: '/%s/'\n", argv[i]);
}
}
}
#elif WINDOWS
int i = 0;
int errorCode = 0;
int directoryExists = 0;
DWORD attributes = 0;
char errorString[256];
for(i = 1; i < argc; i++)
{
attributes = GetFileAttributes(argv[i]);
directoryExists = (attributes != INVALID_FILE_ATTRIBUTES &&
(attributes & FILE_ATTRIBUTE_DIRECTORY));
if (!directoryExists)
{
errorCode = CreateDirectory(argv[i], NULL);
if (errorCode == 0)
{
errorCode = GetLastError();
if (errorCode != 0)
{
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, errorCode, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
errorString, sizeof(errorString)-1, NULL);
printf("Error: failed to create directory '%s' (%d, %s)\n", argv[i],
errorCode, errorString);
}
}
else
{
printf("Created: '/%s/'\n", argv[i]);
}
errorCode = 0;
}
}
#endif
}
static void PrintDataToFile(const char* const fileName)
{
#ifdef UNIX
FILE* f = NULL;
DIR* dp = NULL;
struct dirent* ent = NULL;
struct stat st;
dp = opendir(".");
if (dp == NULL)
{
printf("Error: failed to open directory '%s' (%d, %s)\n", ".",
errno, strerror(errno));
}
else
{
f = fopen(fileName, "w");
ent = readdir(dp);
while (ent != NULL)
{
stat(ent->d_name, &st);
if (S_ISDIR(st.st_mode))
{
fprintf(f, "%s\n", ent->d_name);
}
ent = readdir(dp);
}
closedir(dp);
fclose(f);
f = NULL;
}
#elif WINDOWS
char* dirName = NULL;
WIN32_FIND_DATA fd;
FILE* f = NULL;
HANDLE handle;
handle = FindFirstFile("*.", &fd);
if (handle != INVALID_HANDLE_VALUE)
{
f = fopen(fileName, "w");
do
{
dirName = fd.cFileName;
if (strcmp(dirName, ".") != 0 && strcmp(dirName, "..") != 0)
{
fprintf(f, "%s\n", dirName);
}
}
while (FindNextFile(handle, &fd));
FindClose(handle);
fclose(f);
f = NULL;
}
else
{
printf ("FindFirstFile failed (%d)\n", GetLastError());
}
#endif
}