Создать текстовый файл, в который поместить информацию о списке подпапок текущей папки - 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
}

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы