2016-08-03 5 views
1

私は次の権限とパス/var/cache/apt/archivesを読みしようとしている:Valaでrootが所有するフォルダを読むにはどうすればよいですか?

drwxr-xr-x 3 root root 90112 ago 2 14:36 archives 

そして、私は、次のエラーを得た:

ERROR: Error opening directory '/var/cache/apt/archives/partial': Permission denied 

は、誰かが私にこれに手を与えることができますか?

ソースコードは以下の通りです:

using Gtk; 
using GLib; 

private int64[] get_folder_data (File file, string space = "",  Cancellable? cancellable = null) throws Error 
{ 
    FileEnumerator enumerator = file.enumerate_children (
    "standard::*", 
    FileQueryInfoFlags.NOFOLLOW_SYMLINKS, 
    cancellable); 

    int64 files = 0; 
    int64 size = 0; 
    int64[] data = new int64[2]; 
    FileInfo info = null; 

    while (cancellable.is_cancelled() == false && ((info = enumerator.next_file (cancellable)) != null)) { 
     if (info.get_file_type() == FileType.DIRECTORY) { 
      File subdir = file.resolve_relative_path (info.get_name()); 
      get_folder_data (subdir, space + " ", cancellable); 
     } else { 
      files += 1;//Sum Files 
      size += info.get_size();//Accumulates Size 
     } 
    } 

    if (cancellable.is_cancelled()) { 
     throw new IOError.CANCELLED ("Operation was cancelled"); 
    } 

    data[0] = files; 
    data[1] = size; 

    stdout.printf ("APT CACHE SIZE: %s\n", files.to_string()); 
    stdout.printf ("APT CACHE FILES: %s\n", size.to_string()); 

    return data; 
} 

public static int main (string[] args) { 
    Gtk.init (ref args); 

    File APT_CACHE_PATH = File.new_for_path ("/var/cache/apt/archives"); 
    try { 
     get_folder_data (APT_CACHE_PATH, "", new Cancellable()); 
    } catch (Error e) { 
     stdout.printf ("ERROR: %s\n", e.message);  
    } 
    Gtk.main(); 
    return 0; 
} 

そして、私はコンパイルのために使用するコマンドは以下の通りです:

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

答えて

0

あなたが通常のユーザーとしてアプリケーションを実行する場合、あなたは除外しなければなりません"部分"ディレクトリには、より制限的なアクセス権(0700)があります。

drwx------ 2 _apt root 4096 Jul 29 11:36 /var/cache/apt/archives/partial 

常に明示的に部分的なフォルダを無視することは良い考えかもしれませんまた

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; 
} 

:TiAlのdirがちょうどアクセスできない任意のディレクトリを無視することです。

あなたのユーティリティをrootユーザーにとっても便利にする予定があるなら、 "--include-partial-dir"のようなコマンドラインオプションを追加することも考えられます。

また、同じことは、独自のプログラムを作成するよりはるかに簡単な簡単なbashコマンドで行うことができます。 dufindもアクセスできない部分ディレクトリについて警告していること

du -sh /var/cache/apt/archives 
find /var/cache/apt/archives -type f | wc -l 

注:

$ 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 
+0

おかげで仲間!あなたは何を言った:) – lozanotux

関連する問題