Directory 如何使用Vala读取root拥有的文件夹?

Directory 如何使用Vala读取root拥有的文件夹?,directory,file-permissions,vala,apt,file-listing,Directory,File Permissions,Vala,Apt,File Listing,我正在尝试使用以下权限读取路径/var/cache/apt/archives: drwxr-xr-x 3 root root 90112 ago 2 14:36 archives 我得到了以下错误: ERROR: Error opening directory '/var/cache/apt/archives/partial': Permission denied 谁能帮我一下吗 源代码如下所示: 使用Gtk; 使用油嘴滑舌; private int64[]获取文件夹数据(文件文件,字符串空

我正在尝试使用以下权限读取路径
/var/cache/apt/archives

drwxr-xr-x 3 root root 90112 ago 2 14:36 archives
我得到了以下错误:

ERROR: Error opening directory '/var/cache/apt/archives/partial': Permission denied
谁能帮我一下吗

源代码如下所示:

使用Gtk;
使用油嘴滑舌;
private int64[]获取文件夹数据(文件文件,字符串空格=,可取消?可取消=null)引发错误
{
FileEnumerator enumerator=file.enumerate\u子项(
“标准::*”,
FileQueryInfoFlags.NOFOLLOW_符号链接,
可取消);
int64文件=0;
int64大小=0;
int64[]数据=新的int64[2];
FileInfo=null;
while(cancelable.is_cancelled()==false&((info=enumerator.next_file(cancelable))!=null)){
if(info.get_file_type()==FileType.DIRECTORY){
File subdir=File.resolve_relative_path(info.get_name());
获取文件夹数据(子目录,空格+“”,可取消);
}否则{
files+=1;//对文件求和
size+=info.get_size();//累积大小
}
}
if(cancelable.is_cancelled()){
抛出新IOError.CANCELLED(“操作已取消”);
}
数据[0]=文件;
数据[1]=大小;
stdout.printf(“APT缓存大小:%s\n”,files.to_string());
stdout.printf(“APT缓存文件:%s\n”,size.to_string());
返回数据;
}
公共静态int main(字符串[]args){
Gtk.init(参考参数);
File APT_CACHE_PATH=File.new_for_PATH(“/var/CACHE/APT/archives”);
试一试{
获取文件夹数据(APT\u CACHE\u PATH,“,new cancelable());
}捕获(错误e){
stdout.printf(“错误:%s\n”,e.message);
}
Gtk.main();
返回0;
}
我用于编译的命令如下:

valac --pkg gtk+-3.0 --pkg glib-2.0 --pkg gio-2.0 apt-cache.vala

如果您以普通用户身份运行应用程序,则必须排除“部分”目录,它具有更严格的权限(0700):

排除部分目录的一种方法是忽略任何不可访问的目录:

int64[] data = new int64[2];
FileEnumerator enumerator = null;
try {
    enumerator = file.enumerate_children (
        "standard::*",
        FileQueryInfoFlags.NOFOLLOW_SYMLINKS,
        cancellable);
}
catch (IOError e) {
    stderr.printf ("WARNING: Unable to get size of dir '%s': %s\n", file.get_path (), e.message);
    data[0] = 0;
    data[1] = 0;
    return data;
}
此外,始终显式忽略部分文件夹可能是一个好主意

如果您计划使实用程序对根用户也有用,您甚至可以考虑添加一个命令行选项,如“-include partial dir”

同样的事情也可以通过简单的bash命令来完成,这比编写自己的程序容易得多

du -sh /var/cache/apt/archives
find /var/cache/apt/archives -type f | wc -l
请注意,
du
find
还警告不可访问的部分目录:

$ du -sh /var/cache/apt/archives
du: cannot read directory '/var/cache/apt/archives/partial': Permission denied
4.6G    /var/cache/apt/archives

$ find /var/cache/apt/archives -type f | wc -l
find: '/var/cache/apt/archives/partial': Permission denied
3732

如果您以普通用户身份运行应用程序,则必须排除“部分”目录,它具有更严格的权限(0700):

排除部分目录的一种方法是忽略任何不可访问的目录:

int64[] data = new int64[2];
FileEnumerator enumerator = null;
try {
    enumerator = file.enumerate_children (
        "standard::*",
        FileQueryInfoFlags.NOFOLLOW_SYMLINKS,
        cancellable);
}
catch (IOError e) {
    stderr.printf ("WARNING: Unable to get size of dir '%s': %s\n", file.get_path (), e.message);
    data[0] = 0;
    data[1] = 0;
    return data;
}
此外,始终显式忽略部分文件夹可能是一个好主意

如果您计划使实用程序对根用户也有用,您甚至可以考虑添加一个命令行选项,如“-include partial dir”

同样的事情也可以通过简单的bash命令来完成,这比编写自己的程序容易得多

du -sh /var/cache/apt/archives
find /var/cache/apt/archives -type f | wc -l
请注意,
du
find
还警告不可访问的部分目录:

$ du -sh /var/cache/apt/archives
du: cannot read directory '/var/cache/apt/archives/partial': Permission denied
4.6G    /var/cache/apt/archives

$ find /var/cache/apt/archives -type f | wc -l
find: '/var/cache/apt/archives/partial': Permission denied
3732