c# FileStream StreamWriter从其他程序调用时不创建文件
本文关键字:创建 文件 调用 程序 FileStream StreamWriter 其他 | 更新日期: 2023-09-27 18:14:29
我正在编写一个程序,作为一个测试插件与第三方程序。我已经与另一端的开发人员进行了交谈(不要让我开始),他正在使用VB 6创建批处理文件,然后使用shell命令调用批处理文件。他的批处理文件正在调用我的插件,我已经根据我通过他的批处理文件收到的参数将数据输出到一个文件。
我的问题是,当他的程序通过shell命令调用批处理文件(再次,他使用VB 6),我的程序执行和控制台写行,我放在前面和之后的文件流的东西都执行,但文件没有创建,因此他的程序不读取我创建的文件(CP07.txt在这种情况下)。如果我从Windows资源管理器手动运行批处理文件,一切都如预期的那样工作。如果有用的话,我有一个进程监控捕获。该程序在Win7机器上以本地管理员的身份运行(尽管它没有被提升),UAC被禁用,没有安装杀毒软件,并且它没有写入根或系统文件夹。
谢谢你的指点。由于ProcMon捕获很长(1400多行),我没有发布它。
问候,S
这是另一个程序的样例批处理文件…
- 我的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");
}
}
}
我猜问题是你正在写入"当前目录",当你的程序由批处理文件启动时,它可以是任何东西,它本身已经由另一个应用程序启动。将文件写入批处理文件所在的目录中并非不可能:)