mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +01:00
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.
This commit is contained in:
parent
31960257a6
commit
00c00e2f3f
@ -295,6 +295,7 @@ G_FILE_ATTRIBUTE_THUMBNAILING_FAILED
|
|||||||
G_FILE_ATTRIBUTE_PREVIEW_ICON
|
G_FILE_ATTRIBUTE_PREVIEW_ICON
|
||||||
G_FILE_ATTRIBUTE_FILESYSTEM_SIZE
|
G_FILE_ATTRIBUTE_FILESYSTEM_SIZE
|
||||||
G_FILE_ATTRIBUTE_FILESYSTEM_FREE
|
G_FILE_ATTRIBUTE_FILESYSTEM_FREE
|
||||||
|
G_FILE_ATTRIBUTE_FILESYSTEM_USED
|
||||||
G_FILE_ATTRIBUTE_FILESYSTEM_TYPE
|
G_FILE_ATTRIBUTE_FILESYSTEM_TYPE
|
||||||
G_FILE_ATTRIBUTE_FILESYSTEM_READONLY
|
G_FILE_ATTRIBUTE_FILESYSTEM_READONLY
|
||||||
G_FILE_ATTRIBUTE_GVFS_BACKEND
|
G_FILE_ATTRIBUTE_GVFS_BACKEND
|
||||||
|
@ -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_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_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_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_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_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>
|
* <row><entry>%G_FILE_ATTRIBUTE_GVFS_BACKEND</entry><entry>gvfs::backend</entry><entry>string</entry></row>
|
||||||
|
@ -728,6 +728,17 @@ typedef struct _GFileInfoClass GFileInfoClass;
|
|||||||
**/
|
**/
|
||||||
#define G_FILE_ATTRIBUTE_FILESYSTEM_FREE "filesystem::free" /* uint64 */
|
#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:
|
* G_FILE_ATTRIBUTE_FILESYSTEM_TYPE:
|
||||||
*
|
*
|
||||||
|
@ -990,6 +990,25 @@ g_local_file_query_filesystem_info (GFile *file,
|
|||||||
#if defined(USE_STATFS) || defined(USE_STATVFS)
|
#if defined(USE_STATFS) || defined(USE_STATVFS)
|
||||||
g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, block_size * statfs_buffer.f_blocks);
|
g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, block_size * statfs_buffer.f_blocks);
|
||||||
#endif
|
#endif
|
||||||
|
#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 */
|
#endif /* G_OS_WIN32 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user