Определение типа файла и перенос его в папку в зависимости от типа

Рейтинг: 3Ответов: 4Опубликовано: 18.10.2014

В папке имеется несколько файлов. Требуется определить тип каждого файла и в зависимости от этого перенести его в одну из папок:

  • EXE.
  • CPP.
  • H.
  • TXT.

Вроде бы формулировка простая, но никак не могу сделать, мыслей нет, помогите, если не трудно. Заранее спасибо.

Ответы

▲ 3Принят

Как мне кажется, нужно копать в сторону функции findfirst() и проверки строки из имени по шаблону . с последующей сортировкой и презаписи в другой каталог.


Ну и еще, как вариант, написать скрипт на shell и запускать его из приложения.


UPD: вот немного кода в котором происходит поиск надо только немного изменить (произвести копирование)

#include <iostream>
#include <Windows.h>

using namespace std;

int main(){
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    // Find the first file in the directory.
    hFind = FindFirstFile("C:\\*.bin", &FindFileData);

    if (hFind == INVALID_HANDLE_VALUE) {
        printf ("Invalid file handle. Error is %u.\n", GetLastError());
    } else {
        printf ("First file name is %s.\n", FindFileData.cFileName);

        // List all the other files in the directory.
        while (FindNextFile(hFind, &FindFileData) != 0){
            printf ("Next file name is %s.\n", FindFileData.cFileName);
        }

        FindClose(hFind);
    }

    return 0;
}
▲ 4

Перебираете имена файлы в папке. Ищите в имени файла точку. Проверяете текст после нее, и если подходит под один из заданных, то, переименовывая файл, отправляете его в нужную папку.

В *nix посмотрите man-ы на opendir, readdir, rename (для винды посмотрите в гугле их аналоги), а также strchr, strcmp, strcpy (или snprintf) ...

▲ 2

На Питоне:

import os

extensions = '.EXE', '.CPP', '.H', '.TXT'
for name in os.listdir(): # все имена в текущей директории
    if name.upper().endswith(extensions): # имя имеет нужное расширение
        ext = os.path.splitext(name)[1] # изымаем расширение из имени
        new_name = os.path.join(ext[1:].upper(), name) # новое имя в соответствующей директории
        os.replace(name, new_name) # переносим
▲ 2

Тогда вот однострочник на PowerShell:

Get-ChildItem -Path *.cpp, *.h, *.exe, *.txt | ForEach-Object { Move-Item $_ -Destination $(Join-Path $_.Extension.Substring(1) $_.Name) }

Или чуть более длинно на C#:

var exts = new HashSet<string> { ".exe", ".cpp", ".h", ".txt" };
foreach (var fi in new DirectoryInfo(path).EnumerateFiles("*.cpp")
                                          .Where(fi => exts.Contains(fi.Extension)))
    fi.MoveTo(Path.Combine(path, fi.Extension.Substring(1), fi.Name));