2010-08-26 1 views
2

В настоящее время мое приложение принимает текстовый файл/файлы, анализирует их на другой тип файла и помещает на диск. Затем я вызываю вторичную программу (не мою) для обработки текстового файла THAT в третью.C#: Внешний входной/выходной EXE-канал из переменной строки

Внешней программа в основном делает одно:

program.exe --input: foo.txt --output: bar.txt

То, что я хотел бы знать ... я могу заменить foo.txt и bar.txt со строкой [] в моем «объекте».

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

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

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

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 в качестве выходного

ответ

0

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

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

+0

Мне нужно исследовать, может ли программа принимать такие аргументы ... Я не думаю, что это возможно. В конечном счете, мне, возможно, придется перестроить его функциональность ... Хотя я и надеялся избежать этого. – WernerCD

+0

Глядя на Detours ... нормальный вариант 32bit. Если внешний файл 32 бит ... но я компилирую/запускаю на 64-битном ... hrm ... – WernerCD

+0

@WernerCD - ОС не имеет значения, если приложение, которое вы хотите перехватить, 32-бит. У меня есть некоторая библиотека, отличная от MS, где-то рядом с подобным материалом, который поддерживает 64 бит, но имя ускользает от меня прямо сейчас. – snemarch

0

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

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

Смежные вопросы