gpt4 book ai didi

c++ - 测试文件夹可读性/可写性的正确方法

转载 作者:IT王子 更新时间:2023-10-29 01:16:52 28 4
gpt4 key购买 nike

我写了一个函数来测试文件夹的可读/可写性。

为了对其进行单元测试,我需要生成不同的案例:

  • 包含可读写文件的文件夹
  • 一个包含可读文件(不可写)的文件夹
  • 一个不可写且不可读的文件夹。

到目前为止,这是我使用的函数的代码:

void FileUtils::checkPath(std::string path, bool &readable, bool &writable)
{
namespace bf = boost::filesystem;
std::string filePath = path + "/test.txt";

// remove a possibly existing test file
remove(filePath.c_str());

// check that the path exists
if(!bf::is_directory(path))
{
readable = writable = false;
return;
}

// try to write in the location
std::ofstream outfile (filePath.c_str());
outfile << "I can write!" << std::endl;
outfile.close();

if(!outfile.fail() && !outfile.bad())
{
writable = true;
}

// look for a file to read
std::ifstream::pos_type size;
char * memblock;
for (bf::recursive_directory_iterator it(path); it != bf::recursive_directory_iterator(); ++it)
{
if (!is_directory(*it))
{
std::string sFilePath = it->path().string();
std::ifstream file(sFilePath.c_str(), std::ios::in|std::ios::binary|std::ios::ate);
if (file.is_open())
{
size = file.tellg();
if(size > 0)
{
memblock = new char [1];
file.seekg (0, std::ios::beg);
file.read (memblock, 1);
file.close();
delete[] memblock;
if(!file.fail() && !file.bad())
{
readable = true;
}
break;
}
}
else
{
// there is a non readable file in the folder
// readable = false;
break;
}
}
}

// delete the test file
remove(filePath.c_str());
}

现在进行测试(使用 Google 测试完成):

TEST_F(FileUtilsTest, shouldCheckPath)
{
// given an existing folder
namespace fs = boost::filesystem;
fs::create_directory("/tmp/to_be_deleted");

bool readable = false, writable = false;

FileUtils::checkPath("/tmp/to_be_deleted",readable, writable);

fs::boost::filesystem::remove_all("/tmp/to_be_deleted");

EXPECT_TRUE(readable && writable);
}

当我走得更远时,我会为其他情况添加更多内容。

现在游戏开放,可以提出更好的解决方案:-)

最佳答案

检查权限的万无一失的方法是逐字检查文件模式。在目录权限的情况下,“可读”和“可写”的含义可能令人惊讶:

  • 读取 - 允许您列出目录的内容
  • 写入 - 允许您从目录中创建、重命名和删除文件,实质上是修改内容列表(也需要执行)
  • 执行 - 允许您访问(读取和写入)和更改目录中文件的属性

因此,如果您有一个仅设置了执行位的目录,您仍然可以读取和写入其中的文件。通过关闭执行位,您可以禁用对文件的访问。就包含的文件而言,从目录权限中最多可以看出:

  • --x or r-x: 现有文件可以读写
  • -wx or rwx: 可以读取和写入现有文件,可以创建、重命名和删除文件
  • 否则:您根本无权访问这些文件

要确定文件是否可读但不可写(反之亦然),您需要检查文件本身的权限。该目录只能告诉您一般情况下文件是否可以访问。

您可以使用 stat() access() (参见 BЈовић 的评论)找出文件或目录的权限。由于您已经在使用 boost,因此您还可以使用 boost::filesystem::status()它简单地包装了 stat()。

关于c++ - 测试文件夹可读性/可写性的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12565603/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com