C# 在C中保存由特定进程打开的文件

C# 在C中保存由特定进程打开的文件,c#,regex,batch-file,process,file-extension,C#,Regex,Batch File,Process,File Extension,我正在使用公共域中不存在的文件类型。该文件是二进制或十六进制的,但以前编写的批处理文件在双击文件以在记事本中将其作为.txt文件打开时运行 我试图做的是在我的程序中打开这个文件,然后在它打开时保存它,这样它现在就是一个.txt文件,我可以使用它 因此,我启动批处理文件过程,文件本身就是参数 /*Start the batch file and open file (as an argument) * Then it'll be viewable as a text file

我正在使用公共域中不存在的文件类型。该文件是二进制或十六进制的,但以前编写的批处理文件在双击文件以在记事本中将其作为.txt文件打开时运行

我试图做的是在我的程序中打开这个文件,然后在它打开时保存它,这样它现在就是一个.txt文件,我可以使用它

因此,我启动批处理文件过程,文件本身就是参数

/*Start the  batch file and open file (as an argument)
         * Then it'll be viewable as a text file 
         * */
        Process process = new Process();
        process.StartInfo.FileName = "C:/batchfile.bat";
        process.StartInfo.Arguments = "C:/file.ext";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();
然后,我使用Regex查看当前运行的进程是否有文件扩展名,是否在记事本中运行:

/*Using a regex pattern, we can see if a wtd file has been opened
         * If there is, it's added to an array called matchArr
         * */

String pattern = "^.*ext.*Notepad.*$";
        Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
        Process[] processes = Process.GetProcesses();
        int useMatch = 0;
        String[] matchArr = new String[100];
        foreach (var proc in processes)
        {
            MatchCollection matches = rgx.Matches(proc.MainWindowTitle);
            if (!string.IsNullOrEmpty(proc.MainWindowTitle))

                if (matches.Count > 0)
                {

                    useMatch = matches.Count;
                    for (int i = 0; i < useMatch; i++)
                    {
                        matchArr[i] = proc.MainWindowTitle;
                        String blah = proc.Modules[0].FileName;
                        string path = System.IO.Path.GetFullPath(proc.MainWindowTitle);

                        Console.WriteLine("Path:" +path);
                        StreamReader stream = new StreamReader(blah);
                        FileStream fstr = new FileStream("C:/newName.txt", FileMode.Create, FileAccess.Write);
                        using (StreamWriter strw = new StreamWriter(fstr))
                        {
                            strw.WriteLine(stream);
                            Console.WriteLine("Array is : " + matchArr[i].ToString());
                        }
                    }
                }
        }
我在谷歌上搜索了一整天——我的方法肯定出了什么问题,但我不认为要想弄明白这一点应该如此困难。任何帮助都将不胜感激——我也不是C语言的母语,所以请原谅任何不好的编码实践


有人能帮我弄清楚如何把这个文件改成.txt文件吗?而且,C显然不把它读成.txt,所以我不能像在记事本中那样更改文件扩展名,这就是为什么我要这样做。我也花了很多时间在编码上,但都没有用。

如果它是二进制的,你可以用这种方式将它转换成文本并保存:

string myString;
using (FileStream fs = new FileStream(YourBinaryFile, FileMode.Open))
using (BinaryReader br = new BinaryReader(fs))
{
    byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
    myString = Convert.ToBase64String(bin);
}
然后您可以通过以下方式将其写入文件:

File.WriteAllText(YourTargetTxtFile, myString);
或者在你认为合适的时候使用它。 希望有帮助

编辑:

也可以使用此函数指定编码,重载:

File.WriteAllText(file, contents, encoding);

你的批处理文件是做什么的?嗨,我自己没有写过批处理文件我从来没有写过,但基本上它做的是当你试图打开一个文件时,它会找到该文件的最新版本并启动记事本来读取它-我想还有另一个批处理文件可以将其转换为可读形式-这就是我所知道的,道歉!我建议您修改批处理文件,不要启动记事本,而是使用它执行其他操作。如果你在你的帖子中包含了批处理文件,也许有人可以帮你。嗨,我真的不喜欢添加批处理文件,因为这不是我的工作,所以我必须尝试并解决它,没有它-我很感激这个建议。克里斯-我已经广泛地尝试过了:它不起作用;我认为ANSI是问题的一部分。基本上,它可以保存它,但它用gobbledygook编码。所以我也不能用这个。因此,为什么我要尝试这种非常复杂的方法呢!谢谢你的尝试,非常感谢。哦,我现在明白了。我以为你做得很复杂,但也许你不应该尝试发明轮子。您是否尝试指定编码?更新我的答案。嗨,是的,我有,但仍然没有运气!创建的txt文件中仍然存在随机字符。我真的不知道该怎么做;这不应该这么难。也许它与原始文件类型有关——正如我所说,它是一个私有扩展,所以这可能就是编码出错的原因!扩展只是操作系统的一个标识符。它不会改变C与之交互的方式——这完全取决于您。但这可能意味着文件不仅仅是文本。在将其保存为C语言的简单文本文件之前,您可能需要对其进行解码或转换。我是否可以简单地找出文件中的数据类型?谢谢你迄今为止的帮助!