C++ CFile 与 C# App 共享不起作用?
C++ CFile sharing with C# App not working?
我在创建文件并使用 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++ 应用程序发生冲突。所以打不开。
在 C++ 中,指定 CFile::shareDenyNone 或 CFile::shareDenyWrite(就像您正在做的那样)
在 C# 中,指定 FileShare.Write 或 FileShare.ReadWrite。
我在创建文件并使用 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++ 应用程序发生冲突。所以打不开。
在 C++ 中,指定 CFile::shareDenyNone 或 CFile::shareDenyWrite(就像您正在做的那样)
在 C# 中,指定 FileShare.Write 或 FileShare.ReadWrite。