C#: чужой EXE-канал ввода / вывода из переменной строки

В настоящее время мое приложение принимает текстовый файл / файлы, анализирует их в файл другого типа и помещает их на диск. Затем я вызываю вторичную программу (не мою) для обработки этого текстового файла в третий.

Зарубежная программа в основном делает одно:

program.exe - вход:foo.txt - выход:bar.txt

Что я хотел бы знать... могу ли я заменить foo.txt и bar.txt на string[] в моем "объекте".

Вместо того, чтобы извлекать информацию из текстового файла и помещать в новый текстовый файл... Я хочу извлечь информацию из имеющейся у меня переменной... в другую переменную, которую я бы сделал.

По сути, я пытаюсь сохранить процесс создания двух стеков файлов путем передачи одной переменной в другую. Я просто не уверен, как это сделать.

Что у меня сейчас (по большей части, с удаленным пухом):

public bool _Out_Schema(string output)
{
    clear(output);                                      // clear output directory

    // Assign schema name to path
    string path = output + '\\' + lf.filename + ".schema";
    using (StreamWriter SW = new StreamWriter(path))
    {
        SW.Write(lf._schema);
    }                
    return true;
}

public bool _Out_UFD(string input, string output)
{
    clear(output);                                      // clear output directory

    ProcessStartInfo SI = new ProcessStartInfo();
    SI.CreateNoWindow = true;
    SI.WindowStyle = ProcessWindowStyle.Hidden;
    SI.FileName = "ufdschema.exe";                      // foreign program

    SI.Arguments = String.Format("--ischema={0}\\{2}.schema --oufd={1}\\{2}.ufd", input, output, (FI.Name.Split('.'))[0]);
    using (Process P = Process.Start(SI)) { P.WaitForExit(); }

    return true;
}

Я хотел бы взять lf.schema (строковую переменную) в качестве входных данных... и создать что-то вроде lf.ufd в качестве выходных данных

2 ответа

Решение

Если в программе нет способа указать "чтение из стандартного ввода и запись в стандартный вывод", вы не сможете легко решить свою проблему. Это возможно, однако, но это потребует некоторых довольно низкоуровневых вещей; в основном вы бы использовали что-то вроде Detours, чтобы зацепить CreateFile и прикрепите его к каналам, когда он увидит специальные имена файлов. ReadFile, WriteFile а также CloseHandle перенаправление не нужно, так как они работают как с конвейерами, так и с дескрипторами файлов.

Это нетривиальное решение, но если у вас есть опыт работы с Win32 API, его можно выполнить в течение нескольких часов, даже если вы не знаете ранее об обходах.

Если program.exe ожидает чтения и записи в файлы на диске, и принимает имена этих файлов через командную строку, вы не можете сделать какое-либо броское перенаправление, чтобы сделать это иначе.

Если у приложения есть другие параметры, которые вы можете настроить, чтобы они передавали входные данные по каналу и возвращали его вывод на консоль, а не в файл, тогда вы должны иметь возможность что-то делать. Судя по деталям, которые сейчас находятся в вашем вопросе, вам, вероятно, не повезло

Другие вопросы по тегам