有没有办法在另一个进程正在读取时写入文件?
Is there a way to write into a file while another process is reading?
我在 C++ 应用程序上有一个写入过程,每当文件发生更改时,另一个 C# 应用程序会不断读取数据。
在 C++ 上:
FILE *fp = fopen(result_file, "a");
if (fp) {
// Write some thing
fclose(fp);
}
在 C# 上:
private void Init() {
FileSystemWatcher watcher = new FileSystemWatcher(ResultFolder);
watcher.Changed += new FileSystemEventHandler(OnResultChanged);
watcher.EnableRaisingEvents = true;
}
private void OnResultChanged(object sender, FileSystemEventArgs e) {
if (e.ChangeType == WatcherChangeTypes.Changed) {
// Check file ready to read
// Ready all lines
string[] lines = File.ReadAllLines(e.FullPath);
// Process lines
}
}
但有时C++上的代码无法打开文件进行读取,我该如何解决?
P/S:我发现在 C# 上我们有一种共享文件访问的方法,例如下面的命令
File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
但在 C++ 中找不到类似的方法。
你在 Windows,所以 C++ 方式是
CreateFile(.... FILE_SHARE_READ | FILE_SHARE_WRITE, ....)
它 returns 一个 Win32 HANDLE
,这在 C++ 中不是最容易使用的东西(没有用于格式化 I/O 的便利函数)。但是你可以把它变成 FILE*
或者 fstream
.
看到这个问题:
- Can I use CreateFile, but force the handle into a std::ofstream?
或者,您可以使用 _fsopen()
的 shflag
参数或 fstream
构造函数的 _Prot
参数:
The argument shflag is a constant expression consisting of one of the
following manifest constants, defined in Share.h.
Term Definition
_SH_COMPAT
Sets Compatibility mode for 16-bit applications.
_SH_DENYNO
Permits read and write access.
_SH_DENYRD
Denies read access to the file.
_SH_DENYRW
Denies read and write access to the file.
_SH_DENYWR
Denies write access to the file.
我在 C++ 应用程序上有一个写入过程,每当文件发生更改时,另一个 C# 应用程序会不断读取数据。
在 C++ 上:
FILE *fp = fopen(result_file, "a");
if (fp) {
// Write some thing
fclose(fp);
}
在 C# 上:
private void Init() {
FileSystemWatcher watcher = new FileSystemWatcher(ResultFolder);
watcher.Changed += new FileSystemEventHandler(OnResultChanged);
watcher.EnableRaisingEvents = true;
}
private void OnResultChanged(object sender, FileSystemEventArgs e) {
if (e.ChangeType == WatcherChangeTypes.Changed) {
// Check file ready to read
// Ready all lines
string[] lines = File.ReadAllLines(e.FullPath);
// Process lines
}
}
但有时C++上的代码无法打开文件进行读取,我该如何解决?
P/S:我发现在 C# 上我们有一种共享文件访问的方法,例如下面的命令
File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
但在 C++ 中找不到类似的方法。
你在 Windows,所以 C++ 方式是
CreateFile(.... FILE_SHARE_READ | FILE_SHARE_WRITE, ....)
它 returns 一个 Win32 HANDLE
,这在 C++ 中不是最容易使用的东西(没有用于格式化 I/O 的便利函数)。但是你可以把它变成 FILE*
或者 fstream
.
看到这个问题:
- Can I use CreateFile, but force the handle into a std::ofstream?
或者,您可以使用 _fsopen()
的 shflag
参数或 fstream
构造函数的 _Prot
参数:
The argument shflag is a constant expression consisting of one of the following manifest constants, defined in Share.h.
Term Definition
_SH_COMPAT
Sets Compatibility mode for 16-bit applications.
_SH_DENYNO
Permits read and write access.
_SH_DENYRD
Denies read access to the file.
_SH_DENYRW
Denies read and write access to the file.
_SH_DENYWR
Denies write access to the file.