diff options
author | Matthias Clasen <mclasen@redhat.com> | 2012-01-09 21:49:08 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2012-01-09 21:49:08 -0500 |
commit | 00c00e2f3f3194202877e54a2429bd1a4f9c5526 (patch) | |
tree | 1a625ef26f385fb62c146b8080452c79c2c72dba /gio | |
parent | 31960257a6f52a4ec92d70986969f3f7ce336c4c (diff) | |
download | glib-00c00e2f3f3194202877e54a2429bd1a4f9c5526.tar.gz |
Add G_FILE_ATTRIBUTE_FILESYSTEM_USED to get exact used space
This is implemented by with statfs_buffer.f_bavail (free blocks
for unprivileged users) as a default way to retrieve real free space.
Based on a patch by Marcus Carlson, bug 625751.
Diffstat (limited to 'gio')
-rw-r--r-- | gio/gfileattribute.c | 1 | ||||
-rw-r--r-- | gio/gfileinfo.h | 11 | ||||
-rw-r--r-- | gio/glocalfile.c | 19 |
3 files changed, 31 insertions, 0 deletions
diff --git a/gio/gfileattribute.c b/gio/gfileattribute.c index 8e4b8bf1e..bca38cc7b 100644 --- a/gio/gfileattribute.c +++ b/gio/gfileattribute.c @@ -194,6 +194,7 @@ * <row><entry>%G_FILE_ATTRIBUTE_PREVIEW_ICON</entry><entry>preview::icon</entry><entry>object (#GIcon)</entry></row> * <row><entry>%G_FILE_ATTRIBUTE_FILESYSTEM_SIZE</entry><entry>filesystem::size</entry><entry>uint64</entry></row> * <row><entry>%G_FILE_ATTRIBUTE_FILESYSTEM_FREE</entry><entry>filesystem::free</entry><entry>uint64</entry></row> + * <row><entry>%G_FILE_ATTRIBUTE_FILESYSTEM_USED</entry><entry>filesystem::used</entry><entry>uint64</entry></row> * <row><entry>%G_FILE_ATTRIBUTE_FILESYSTEM_TYPE</entry><entry>filesystem::type</entry><entry>string</entry></row> * <row><entry>%G_FILE_ATTRIBUTE_FILESYSTEM_READONLY</entry><entry>filesystem::readonly</entry><entry>boolean</entry></row> * <row><entry>%G_FILE_ATTRIBUTE_GVFS_BACKEND</entry><entry>gvfs::backend</entry><entry>string</entry></row> diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h index 952dade01..375a078ec 100644 --- a/gio/gfileinfo.h +++ b/gio/gfileinfo.h @@ -729,6 +729,17 @@ typedef struct _GFileInfoClass GFileInfoClass; #define G_FILE_ATTRIBUTE_FILESYSTEM_FREE "filesystem::free" /* uint64 */ /** + * G_FILE_ATTRIBUTE_FILESYSTEM_USED: + * + * A key in the "filesystem" namespace for getting the number of bytes of used on the + * file system. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT64. + * + * Since: 2.32 + */ +#define G_FILE_ATTRIBUTE_FILESYSTEM_USED "filesystem::used" /* uint64 */ + +/** * G_FILE_ATTRIBUTE_FILESYSTEM_TYPE: * * A key in the "filesystem" namespace for getting the file system's type. diff --git a/gio/glocalfile.c b/gio/glocalfile.c index 7c1b05bfc..cfd805a1b 100644 --- a/gio/glocalfile.c +++ b/gio/glocalfile.c @@ -993,6 +993,25 @@ g_local_file_query_filesystem_info (GFile *file, #endif /* G_OS_WIN32 */ } + if (!no_size && + g_file_attribute_matcher_matches (attribute_matcher, + G_FILE_ATTRIBUTE_FILESYSTEM_USED)) + { +#ifdef G_OS_WIN32 + gchar *localdir = g_path_get_dirname (local->filename); + wchar_t *wdirname = g_utf8_to_utf16 (localdir, -1, NULL, NULL, NULL); + ULARGE_INTEGER li_free; + ULARGE_INTEGER li_total; + + g_free (localdir); + if (GetDiskFreeSpaceExW (wdirname, &li_free, &li_total, NULL)) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_USED, (guint64)li_total.QuadPart - (guint64)li_free.QuadPart); + g_free (wdirname); +#else + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_USED, block_size * (statfs_buffer.f_blocks - statfs_buffer.f_bfree)); +#endif /* G_OS_WIN32 */ + } + #ifndef G_OS_WIN32 #ifdef USE_STATFS #if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) |