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

Пиша програма, която да функционира като тестов плъгин с програма на трета страна. Говорих с разработчика от другата страна (не ме карайте да започвам) и той използва VB 6, за да създаде партиден файл и след това извиква пакетния файл с помощта на командна обвивка. Неговият пакетен файл извиква моя приставка, която съм написал, за да извежда данни във файл въз основа на параметрите, които получавам чрез неговия пакетен файл.

Проблемът ми е, че когато програмата му извика груповия файл чрез командна обвивка (отново, той използва VB 6), моята програма се изпълнява и редовете за писане на конзолата, които поставям пред и след нещата от файловия поток, се изпълняват, но файлове не се създават и следователно неговата програма не чете файла, който създавам (CP07.txt в този случай). Ако стартирам ръчно пакетния файл от Windows Explorer, всичко работи според очакванията. Имам улавяне на монитор на процеса, ако това е от полза. Програмата работи като локален администратор на 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