【发布时间】:2015-11-10 19:00:14
【问题描述】:
我不得不注意到我机器上Bazaar 的目录锁定机制的一些奇怪行为,并试图重现它。这是我的简单测试用例:
创建目录
Test,然后创建Test/held,然后创建文件Test/held/info。将
Test重命名为YXCV。读取在步骤 1 中创建的文件(现在从路径
YXCV/held/info)。清理(删除文件和目录)。
重复。
很奇怪,这失败了。有时在第 2 步(“权限被拒绝”),有时在第 3 步(文件无法打开,尽管之后我可以在常规文本编辑器中打开文件)。 有时这会立即失败,有时会成功执行数千次迭代。
我在这里运行的是 Windows 7。我怀疑一些配置更改(公司 IT 管理超出了我的控制),因为问题发生在一周前。
你知道任何可能的合理解释吗?
这是我的测试代码:
#include <iostream>
#include <fstream>
#include <direct.h>
#include <stdio.h>
void mkdir() {
if ( mkdir( "Test" ) ) throw std::runtime_error( "mkdir" );
if ( mkdir( "Test/held" ) ) throw std::runtime_error( "mkdir" );
}
void create() {
if ( !std::ofstream( "Test/held/info" ).write( "asdf", 4 ) )
throw std::runtime_error( "create" );
}
void rename() {
if ( rename( "Test", "YXCV" ) ) throw std::runtime_error( "rename" );
}
void peek() {
char buf[ 4 ];
if ( !std::ifstream( "YXCV/held/info" ).read( buf, 4 ) )
throw std::runtime_error( "peek" );
}
void del() {
if ( unlink( "YXCV/held/info" ) ) throw std::runtime_error( "remove" );
if ( rmdir( "YXCV/held" ) ) throw std::runtime_error( "remove" );
if ( rmdir( "YXCV" ) ) throw std::runtime_error( "remove" );
}
void cleanup() {
unlink( "Test/held/info" );
rmdir( "Test/held" );
rmdir( "Test" );
unlink( "YXCV/held/info" );
rmdir( "YXCV/held" );
rmdir( "YXCV" );
}
int main() {
cleanup();
int count = 1;
try {
for ( ;; ++count ) {
mkdir ();
create();
rename();
peek ();
del ();
}
}
catch ( const std::exception &e ) {
std::cout << "Run: " << count << "\nError: " << e.what() << "\n\t"
<< strerror( errno ) << '\n';
}
std::cin.get();
}
【问题讨论】:
-
您可以使用Process Monitor 准确找出失败的操作和错误代码。也许您遇到了共享违规。
-
检查 peek() 方法是否有任何打开的“信息”文件句柄
-
用你关闭的任何防病毒程序试试。
-
@JonathanPotter 绝对值得一试。如果这是防病毒软件的可能影响,我想知道我的系统是如何保持可用的。
标签: c++ windows winapi file-io filesystems