yoandryLumpuy Ответов: 1

Создайте копию файла с помощью supercopier, ultracopier или teracopy (копир установлен по умолчанию) с помощью кода C #


Мне нужно направить информацию о копии файла таким образом, чтобы сработал установленный по умолчанию копировальный аппарат. Я сделал это с помощью функции SHFileOperation из оболочки Windows API и он работал для меня, но только с Windows принтером, а не с supercopier или любого другого установленного копира.



Что я уже пробовал:

Следующий код выполняет эту задачу, но вызывает индикатор выполнения проводника windows:



[DllImport("shell32.dll", CharSet = CharSet.Unicode, EntryPoint = "SHFileOperation")]
    public static extern Int32 SHFileOperation32(
        ref SHFILEOPSTRUCT32 lpFileOp);

    [DllImport("shell32.dll", CharSet = CharSet.Unicode, EntryPoint = "SHFileOperation")]
    public static extern Int32 SHFileOperation64(
        ref SHFILEOPSTRUCT64 lpFileOp);         // Address of an SHFILEOPSTRUCT structure that contains information 
                                                // this function needs to carry out the specified operation. This 
                                                // parameter must contain a valid value that is not NULL. You are 
                                                // responsibile for validating the value. If you do not validate it, 
                                                // you will experience unexpected results. 


    public static Int32 SHFileOperation(ref SHFILEOPSTRUCT lpFileOp)
    {
        MachineType mt = GetMachineType();
        Int32 result;

        switch (mt)
        {
            case MachineType.win32:
                SHFILEOPSTRUCT32 fos32 = new SHFILEOPSTRUCT32(lpFileOp);
                result = SHFileOperation32(ref fos32);
                lpFileOp.CopyFrom(fos32);
                break;

            case MachineType.win64:
                SHFILEOPSTRUCT64 fos64 = new SHFILEOPSTRUCT64(lpFileOp);
                result = SHFileOperation64(ref fos64);
                lpFileOp.CopyFrom(fos64);
                break;

            default:
                throw new ArgumentException("What kind of computer are you using? It's not 32 and not 64 bit");
        }

        return result;
    }


Эффект отображения индикатора выполнения windows также может быть достигнут с помощью следующего кода:



Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(
            @"D:\file1.txt", 
            @"D:\file2.txt",UIOption.AllDialogs);


Но это не желаемая функциональность. Что требуется, так это вызвать установленный копировальный аппарат windows, такой как Supercopier, Teracopy, Ultracopier или другой. Очевидно, что эти инструменты реализуют расширение оболочки Windows и делают настройку процесса копирования. Я просматривал код на GitHub для некоторых из этих инструментов, чтобы увидеть обработчик крючка копирования, который они реализуют, и я не могу найти способ достичь своей цели.

Мне нужно вызвать оболочку windows таким образом, чтобы эти копировальные аппараты обнаружили событие и обработали его по-своему. Если у кого-то есть предложение, оно будет приветствоваться.


Gerry Schmitz

Итак, это работает, но вам не нравится "индикатор выполнения". В великой схеме вещей ...

yoandryLumpuy

Джерри это прекрасно работает, но клиент-босс, и он хочет, чтобы копировальный аппарат по умолчанию был активирован, потому что иногда они обеспечивают лучшую обработку и поведение копий.

1 Ответов

Рейтинг:
0

Maciej Los

Если вы хотите использовать Supercopier, теракопи-TeraCopy, следует отметить, или другое приложение, вы должны:
1) вызовите его exe через Процесс.Начать[^].
или
2) установите пакет NuGet и используйте его в своем приложении. Видеть: GitHub - alphaonex86/Supercopier: устарел, заменен на Ultracopier[^]


yoandryLumpuy

Сюда?:

ВАР имя_файла1 = @"D:\text1.txt";
ВАР имя_файла2 = @"D:\text2.txt";
ВАР изменение панели = новый изменение панели
{
UseShellExecute = true,
Аргументы = $"копировать /Б \"{имя_файла1}\" \"{имя_файла2}\"",
Имя файла = "cmd.exe",
WindowStyle = ProcessWindowStyle.Скрытый
};

Процесс.Start(processStartInfo);

Но этот способ даже не показывает индикатор выполнения Windows при запуске копирования.
Даже если Teracopy или один из этих копиров могут быть активированы командной строкой, это не то, что я хочу, я хочу, чтобы копия была активирована вызовом windows и чтобы она делегировала ее по желанию одному из этих копиров, даже не зная, установлен ли он, в противном случае используйте тот, который используется по умолчанию. Я не знаю, Может ли быть реализован такой большой спрос на эту функциональность, я не могу найти способ сделать это.