С# FileStream StreamWriter не создает файл при вызове из другой программы

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

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

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

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

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

  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");
    }
}
}

person Saint Ronin    schedule 14.11.2011    source источник
comment
Какой текущий рабочий каталог? Его скрипт вызывает вашу программу из другого каталога? Вывод создается там?   -  person Greg B    schedule 15.11.2011
comment
Спасибо за очевидное... это то, что происходит. Ух... если бы я не был таким новичком, я бы чувствовал себя невероятно глупым, а не просто действительно глупым.   -  person Saint Ronin    schedule 15.11.2011


Ответы (1)


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

person kol    schedule 14.11.2011
comment
Вы можете спросить другого разработчика о том, какой каталог он устанавливает в качестве рабочего каталога при запуске командного файла. Например, если он запускает батник вызовом ShellExecute, то он должен установить текущую директорию, так как это один из параметров этой функции. - person kol; 15.11.2011
comment
Да, это проблема. Мне просто нужно указать путь в моей программе, чтобы я мог контролировать, куда она сбрасывается, поскольку я не контролирую его рабочий каталог. Всем спасибо. - person Saint Ronin; 15.11.2011
comment
Сделанный. Я пытался проголосовать за это, но я еще недостаточно крут для этого. Галочка это.. - person Saint Ronin; 15.11.2011