C # FileStream StreamWriter не создает файл при вызове из другой программы - PullRequest
1 голос
/ 15 ноября 2011

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

Моя проблема заключается в том, что когда его программа вызывает пакетный файл с помощью команды оболочки(опять же, он использует VB 6), моя программа выполняется, и выполняются записи консоли, которые я установил перед и после файлового потока, но файлы не создаются, и поэтому его программа не читает файл, который я создаю(CP07.txt в этом случае).Если я вручную запускаю командный файл из проводника Windows, все работает как положено.У меня есть захват монитора процесса, если это полезно.Программа работает как локальный администратор на машине с Win7 (хотя она и не повышена), UAC отключен, антивирусное программное обеспечение не установлено и запись в корневую или системную папку отсутствует.

Я ценю любые указатели.Поскольку захват ProcMon длинный (1400+ строк), я не опубликовал его.

С уважением, S

Вот пример пакетного файла из другой программы ...

  1. Полный путь к моему exe
  2. Полный путь к выходному файлу
  3. Параметр для моего использования
  4. Имя пользователя
  5. Пароль

    C: \ SpecifiedDir \ myprogram.exe C: \ Specified \ Directory \ CP07.txt параметр имя пользователя пароль

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Plugin
{
class Program
{
    static void Main(string[] args)
    {
        Console.Write("Press any key to begin: ");
        Console.Write("Starting...", Console.ReadLine());
        //Console.WriteLine("Done");

        Console.WriteLine("Number of command line parameters = {0}",args.Length);
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);
        }
        Console.WriteLine("");

        TextWriter defaultOutputMethod = Console.Out;
        TextWriter defaultErrorOutputMethod = Console.Error;

        FileStream fStream;
        StreamWriter strWriter;

        FileStream fErrorStream;
        StreamWriter strErrorWriter;

        try
        {
            fStream = new FileStream("./Redirect.txt", FileMode.OpenOrCreate, FileAccess.Write);
            strWriter = new StreamWriter(fStream);
        }
        catch (Exception e)
        {
            Console.WriteLine("Cannot open Redirect.txt for writing");
            Console.WriteLine(e.Message);
            return;
        }
        try
        {
            fErrorStream = new FileStream("./RedirectError.txt", FileMode.OpenOrCreate, FileAccess.Write);
            strErrorWriter = new StreamWriter(fErrorStream);
        }
        catch (Exception e)
        {
            Console.WriteLine("Cannot open RedirectError.txt for writing");
            Console.WriteLine(e.Message);
            return;
        }

        Console.SetOut(strWriter);
        Console.SetError(strErrorWriter);

        Console.WriteLine("Number of command line parameters = {0}",            args.Length);
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);
        }

        // Store parameters into variables for reference
        string pSuccess = "OK";
        string pFail = "FAIL";
        string pOutputFile = args[0];
        string pLookupType = args[1];
        string pUserName = args[2];
        string pPassword = args[3];


        Console.SetOut(defaultOutputMethod);
        // Console.SetError(defaultErrorOutputMethod);

        strWriter.Close();
        fStream.Close();




        // Setup Commnet filestream and stream writer, and assign output to stream if file successfully created
        FileStream fCommnetStream;
        StreamWriter strCommnetWriter;
        string sCommnetOutputFile = @"./CP07.txt";
        try
        {
            fCommnetStream = new FileStream(sCommnetOutputFile, FileMode.OpenOrCreate, FileAccess.Write);
            strCommnetWriter = new StreamWriter(fCommnetStream);
        }
        catch (Exception e)
        {
            Console.WriteLine("Cannot open " + sCommnetOutputFile + " for writing");
            Console.WriteLine(e.Message);
            return;
        }
        Console.SetOut(strCommnetWriter);


        // Test Variables to determine output: Success or Failure
        string sSuccessPass = "1111";
        string sFailPass = "0000";

        if (pPassword == sSuccessPass)
        {
            Console.WriteLine(pSuccess);
        }
        else if (pPassword == sFailPass)
        {
            Console.WriteLine(pFail);
        }
        else
        {
            Console.WriteLine("OTHER");
        }

        Console.WriteLine("Output File: <" + pOutputFile + ">");
        Console.WriteLine("Lookup Type: <" + pLookupType + ">");
        Console.WriteLine("User Name: <" + pUserName + ">");
        Console.WriteLine("User Pass: <" + pPassword + ">");

        Console.SetOut(defaultOutputMethod);
        Console.SetError(defaultErrorOutputMethod);
        strCommnetWriter.Close();
        fCommnetStream.Close();

        strErrorWriter.Close();
        fErrorStream.Close();

        Console.Write("Press any key to finish: ");
        Console.Write("Ending...", Console.ReadLine());
        //Console.WriteLine("Done");
    }
}
}

1 Ответ

2 голосов
/ 15 ноября 2011

Думаю, проблема в том, что вы записываете в «текущий каталог», который может быть любым, когда ваша программа запускается из пакетного файла, который сам по себе был запущен другим приложением.Не исключено, что ваши файлы будут записаны в каталог, в котором находится пакетный файл:)

...