Как получить информацию о файле через щелчок правой кнопкой мыши в Explorer? [дублировать] ⇐ C#

Место общения программистов C#
Anonymous
Как получить информацию о файле через щелчок правой кнопкой мыши в Explorer? [дублировать]

Сообщение Anonymous »

Для хобби -проекта я хочу иметь возможность извлечь определенные филетипы из файлов .zip и .rar в новый каталог в каталоге, который содержит файлы zip/rar. Я хочу иметь возможность выбрать файлы в исследователе файлов, а затем выполнить программу, щелкнув правой кнопкой мыши, а затем выбрав программу в качестве опции. < /P>
Пример: я загрузил несколько файлов .zip в папку загрузки. Я выбираю их в Windows File Explorer. Я хочу иметь возможность щелкнуть правой кнопкой мыши и выбирать «Извлечение музыки» из контекстного меню правой щелчки, и программа должна затем извлечь типы файлов, указанные в новую папку в папке в папке загрузки. Программа в настоящее время не предоставляет файлы, которые я выбрал в исследователе файла для самой программы. Я также пытался использовать Environment.getCommandlineargs (), но это возвращает файл DLL. Как я могу дать аргументы при выборе одного или нескольких файлов в программу через контекстное меню правого щелчка?using System.IO.Compression;
using System.Globalization;
using SharpCompress.Archives;
using SharpCompress.Archives.Rar;
using SharpCompress.Common;

class Program
{
static readonly string[] AllowedExtensions = { ".mp3", ".wav", ".flac", ".png", ".jpg", ".jpeg" };

static void Main(string[] args)
{
try
{
if (args.Length == 0)
{
Console.WriteLine("Please provide one or more .zip or .rar files as arguments.");
return;
}

string date = DateTime.Now.ToString("dd-MM-yyyy", CultureInfo.InvariantCulture);
string? firstDir = null;
foreach (var archivePath in args)
{
if (!File.Exists(archivePath))
{
Console.WriteLine($"File not found: {archivePath}");
continue;
}

string ext = Path.GetExtension(archivePath).ToLowerInvariant();
if (ext != ".zip" && ext != ".rar")
{
Console.WriteLine($"Skipping unsupported file: {archivePath}");
continue;
}

string outputDir = Path.Combine(Path.GetDirectoryName(archivePath)!, $"music-{date}");
Directory.CreateDirectory(outputDir);
if (firstDir == null) firstDir = outputDir;

if (ext == ".zip")
{
ExtractZip(archivePath, outputDir);
}
else if (ext == ".rar")
{
ExtractRar(archivePath, outputDir);
}

Console.WriteLine($"Extracted from: {archivePath}");
}
if (firstDir != null)
Console.WriteLine($"Extraction complete. Files saved to: {firstDir}");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
finally
{
Console.WriteLine("Press Enter to close this window...");
Console.ReadLine();
}
}

static void ExtractZip(string zipPath, string outputDir)
{
using var archive = ZipFile.OpenRead(zipPath);
foreach (var entry in archive.Entries)
{
if (!entry.FullName.EndsWith("/", StringComparison.Ordinal) &&
AllowedExtensions.Contains(Path.GetExtension(entry.FullName).ToLowerInvariant()))
{
string destPath = Path.Combine(outputDir, Path.GetFileName(entry.FullName));
entry.ExtractToFile(destPath, overwrite: true);
}
}
}

static void ExtractRar(string rarPath, string outputDir)
{
using var archive = RarArchive.Open(rarPath);
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory &&
AllowedExtensions.Contains(Path.GetExtension(entry.Key).ToLowerInvariant()))
{
string destPath = Path.Combine(outputDir, Path.GetFileName(entry.Key));
entry.WriteToFile(destPath, new ExtractionOptions { Overwrite = true });
}
}
}
}
< /code>
И это файл Regedit, который используется для контекстного меню правой щелчки: < /p>
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Extract Music]
@="Extract Music"
"MultiSelectModel"="Document"

[HKEY_CLASSES_ROOT\*\shell\Extract Music\command]
@="\"C:\\Users\\jordy\\source\\repos\\MusicExtractor\\MusicExtractor\\bin\\Debug\\net8.0\\MusicExtractor.exe\" %*"


Подробнее здесь: https://stackoverflow.com/questions/796 ... n-explorer

Вернуться в «C#»