123 lines
4.1 KiB
C#
123 lines
4.1 KiB
C#
using CodeContextGenerator.Interfaces;
|
||
using CodeContextGenerator.Models;
|
||
using System.IO;
|
||
|
||
namespace CodeContextGenerator.Services;
|
||
|
||
public class FileScannerService : IFileScannerService
|
||
{
|
||
private static readonly string[] ExcludedDirectories = {
|
||
"bin", "obj", ".git", "packages", ".vs", "Properties",
|
||
"node_modules", ".vscode", ".idea", "Debug", "Release",
|
||
"wwwroot", "dist", "build", ".gitignore", ".dockerignore"
|
||
};
|
||
|
||
private static readonly string[] IncludedExtensions = { ".cs", ".xaml" };
|
||
|
||
public async Task BuildDirectoryTreeAsync(string path, FileItem parentItem, IProgress<int> progress = null, CancellationToken cancellationToken = default)
|
||
{
|
||
cancellationToken.ThrowIfCancellationRequested();
|
||
|
||
try
|
||
{
|
||
if (!Directory.Exists(path))
|
||
return;
|
||
|
||
var directories = Directory.GetDirectories(path)
|
||
.Where(d => !ExcludedDirectories.Any(ex =>
|
||
d.EndsWith(ex, StringComparison.OrdinalIgnoreCase) ||
|
||
Path.GetFileName(d).Equals(ex, StringComparison.OrdinalIgnoreCase)))
|
||
.ToList();
|
||
|
||
var files = Directory.GetFiles(path)
|
||
.Where(f => IncludedExtensions.Any(ext =>
|
||
f.EndsWith(ext, StringComparison.OrdinalIgnoreCase)))
|
||
.ToList();
|
||
|
||
int totalItems = directories.Count + files.Count;
|
||
int processedItems = 0;
|
||
|
||
// Обрабатываем поддиректории
|
||
foreach (var dir in directories)
|
||
{
|
||
cancellationToken.ThrowIfCancellationRequested();
|
||
|
||
var dirName = Path.GetFileName(dir);
|
||
var dirItem = new FileItem
|
||
{
|
||
Name = dirName,
|
||
FullName = dir,
|
||
IsDirectory = true,
|
||
Parent = parentItem,
|
||
IsSelected = false
|
||
};
|
||
|
||
await BuildDirectoryTreeAsync(dir, dirItem, progress, cancellationToken);
|
||
|
||
// Добавляем директорию только если в ней есть файлы или поддиректории с файлами
|
||
if (dirItem.Children.Count > 0 || files.Count > 0)
|
||
{
|
||
parentItem.Children.Add(dirItem);
|
||
}
|
||
|
||
processedItems++;
|
||
if (totalItems > 0 && progress != null)
|
||
{
|
||
progress.Report((int)((processedItems * 100.0) / totalItems));
|
||
}
|
||
}
|
||
|
||
// Обрабатываем файлы
|
||
foreach (var file in files)
|
||
{
|
||
cancellationToken.ThrowIfCancellationRequested();
|
||
|
||
var fileItem = new FileItem
|
||
{
|
||
Name = Path.GetFileName(file),
|
||
FullName = file,
|
||
IsDirectory = false,
|
||
Parent = parentItem,
|
||
IsSelected = false
|
||
};
|
||
|
||
parentItem.Children.Add(fileItem);
|
||
processedItems++;
|
||
if (totalItems > 0 && progress != null)
|
||
{
|
||
progress.Report((int)((processedItems * 100.0) / totalItems));
|
||
}
|
||
}
|
||
}
|
||
catch (IOException)
|
||
{
|
||
// Игнорируем ошибки доступа к директориям
|
||
}
|
||
catch (UnauthorizedAccessException)
|
||
{
|
||
// Игнорируем ошибки доступа
|
||
}
|
||
}
|
||
|
||
public List<string> GetSelectedFiles(FileItem rootItem)
|
||
{
|
||
var selectedFiles = new List<string>();
|
||
CollectSelectedFiles(rootItem, selectedFiles);
|
||
return selectedFiles;
|
||
}
|
||
|
||
private void CollectSelectedFiles(FileItem item, List<string> selectedFiles)
|
||
{
|
||
if (item.IsDirectory)
|
||
{
|
||
foreach (var child in item.Children)
|
||
{
|
||
CollectSelectedFiles(child, selectedFiles);
|
||
}
|
||
}
|
||
else if (item.IsSelected == true)
|
||
{
|
||
selectedFiles.Add(item.FullName);
|
||
}
|
||
}
|
||
} |