0

我在创建一个文件并使用 c++ 应用程序填充以供另一个 c# 应用程序读取时遇到问题,而该文件仍在 c++ 应用程序中打开。

我使用以下行创建文件:

txtFile.Open(m_FileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite, &e)

我也尝试过使用这些行:

txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone, &e)

和:

txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite, &e)

结果相同。

然后在 c# 应用程序中,我尝试了 2 种不同的打开文件的方式:

FileStream fs = File.OpenRead(inputfilepath);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();

byte[] buffer;
using (FileStream stream = new FileStream(inputfilepath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    buffer = new byte[stream.Length];
    stream.Read(buffer, 0, buffer.Length);
}

两种方法都会捕获错误:

该进程无法访问文件“filename.txt”,因为它正被另一个进程使用。

c++ 应用程序创建文件,然后使用 CreateProcess 运行 c# 应用程序。

我希望问题出在我尝试读取文件的 c# 代码中,因为当我在 c++ 应用程序中添加共享权限时,记事本不会出错,但是当我不设置权限时确实会出错。

最后,我按照 Soonts 的建议让它按照我想要的方式工作。

将 c++ 文件共享选项设置为:

txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite, &e)

让 c# 应用程序读取文件,但不写入文件。

在 c# 应用程序中读取文件:

using (FileStream stream = new FileStream(inputfilepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

将文件访问权限设置为只读。但是将文件共享权限设置为读写允许文件在被另一个应用程序写入时打开。我出错的地方是文件共享权限是只读的,因为它甚至在文件打开之前就与 c++ 应用程序冲突。所以打不开。

4

1 回答 1

0

在 C++ 中,指定 CFile::shareDenyNone 或 CFile::shareDenyWrite (就像你正在做的那样)

在 C# 中,指定 FileShare.Write 或 FileShare.ReadWrite。

于 2016-04-25T07:56:54.373 回答