窗口中的文件损坏 电源故障后操作系统
File corruption in windows Opertaing sytem after power failure
下面的操作在我们的应用程序中非常频繁地发生,每当电源故障发生时.xml都会被损坏,当使用记事本++打开时,我只看到NULNULNULNULNUL。我尝试禁用缓存并使用 remove(( 和 rename(( 的组合将 src.xml.ignore 重命名为 dest.xml .还是同样的问题.在断电期间有没有办法解决这个问题
MemoryOutputStream file;
file << dir << '' << relPath << idToUse << ".xml.ignore";
CSString temp = file.AsString(); /* CSString is our internalstring class it can be converted into const char* */
FileUtils::MakeDirsInFilePath( temp );
static const int NUM_RETRIES = 50;
static const int WAIT_AMT = 100;
int i;
for ( i = 0; i < NUM_RETRIES; ++i )
{
FILE * fp = ::_fsopen( temp, "wb", _SH_DENYRW );
if ( fp != 0 )
{
FileOutputStream fos( fp, true );
fos << xml;
if ( fos.Close() )
{
break;
}
FileUtils::Delete( temp );
}
Thread::SleepFor( WAIT_AMT );
}
if ( i == NUM_RETRIES )
{
return false;
}
// move into place
//
file.Reset();
file << dir << '' << idToUse << ".xml";
CSString dest = file.AsString();
DWORD flags = MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH;
if (overwrite) flags |= MOVEFILE_REPLACE_EXISTING;
BOOL rc = ::MoveFileEx( src, dest, flags ); ///Dest file is getting corrupted
您需要使用同步 IO,这意味着您将不得不使用 Windows API 而不是 FILE
和 fopen
。
我已经没有做过Windows编程n年了,但是快速的Google搜索表明您需要使用CreateFile
(我猜FILE_FLAG_NO_BUFFERING
和FILE_FLAG_OVERLAPPED
标志,但这是ctrl + f(。 获得文件句柄后,请使用WriteFile
相关文章:
- 分段故障(堆芯转储)矢量
- C++中的动态铸造故障
- 数组的指针从不分段故障
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 在C++中设置基于操作系统的文件路径
- 调试 CUDA MMU 故障
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- 正在处理故障(堆芯转储)
- 在 Boost::fiber 中引发的BOOST_ASSERT故障 Visual Studio "Debug" 构建
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- C++函数过载会导致 SEG 故障
- 分段故障 运行C++代码时出现 SIGSEGV
- WideCharToMultiByte在英语操作系统上不转换日语
- 窗口中的文件损坏 电源故障后操作系统
- 分段故障 139(核心转储)C++更改操作系统后
- gSoap中的分段故障,由于接收到来自操作系统的信号,劣化停止