C#FileStream StreamWriter从其他程序调用时不创建文件

时间:2011-11-14 23:38:34

标签: c# filestream streamwriter

我正在编写一个程序,作为第三方程序的测试插件。我在另一端与开发人员交谈过(不要让我开始)他正在使用VB 6创建批处理文件,然后使用shell命令调用批处理文件。他的批处理文件正在调用我的插件,我根据我通过批处理文件收到的参数将数据输出到文件中。

我的问题是,当他的程序通过shell命令调用批处理文件时(再次,他正在使用VB 6),我的程序执行并且我在文件流之前和之后放置的控制台写入所有执行,但文件未创建,因此他的程序不会读取我创建的文件(在本例中为CP07.txt)。如果我从Windows资源管理器手动运行批处理文件,一切都按预期工作。如果这是有益的,我确实有一个过程监控器捕获。该程序作为Win7计算机上的本地管理员运行(虽然它没有升级),UAC已禁用,没有安装防病毒软件,也没有写入根目录或系统文件夹。

我感谢任何指针。由于ProcMon捕获时间很长(超过1400行),我还没有发布它。

此致 小号

以下是来自其他程序的示例批处理文件...

  1. 我的exe的完整路径
  2. 输出文件的完整路径
  3. 我使用的参数
  4. 用户名
  5. 密码

    C:\ SpecifiedDir \ myprogram.exe C:\ Specified \ Directory \ CP07.txt参数用户名密码

  6. 我正在覆盖输出文件参数,因为它最初不是以其他方式工作(我想可能与斜线被转义或某事有关)而且我想从一个简单而有效的程序开始然后从那里清理它。

    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 个答案:

答案 0 :(得分:2)

我想问题是你正在写入“当前目录”,当你的程序由批处理文件启动时,它可以是任何东西,批处理文件本身已由另一个应用程序启动。将文件写入批处理文件所在的目录并非不可能:)