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
ожидает чтения и записи в файлы на диске, и принимает имена этих файлов через командную строку, вы не можете сделать какое-либо броское перенаправление, чтобы сделать это иначе.
Если у приложения есть другие параметры, которые вы можете настроить, чтобы они передавали входные данные по каналу и возвращали его вывод на консоль, а не в файл, тогда вы должны иметь возможность что-то делать. Судя по деталям, которые сейчас находятся в вашем вопросе, вам, вероятно, не повезло