448
|
1 /*
|
|
2 * Copyright (c) 2000, Red Hat, Inc.
|
|
3 *
|
|
4 * This program is free software; you can redistribute it and/or modify
|
|
5 * it under the terms of the GNU General Public License as published by
|
|
6 * the Free Software Foundation; either version 2 of the License, or
|
|
7 * (at your option) any later version.
|
|
8 *
|
|
9 * A copy of the GNU General Public License can be found at
|
|
10 * http://www.gnu.org/
|
|
11 *
|
|
12 * Written by DJ Delorie <dj@cygnus.com>
|
|
13 *
|
|
14 */
|
|
15
|
|
16 /* The purpose of this file is to hide the mess needed just to figure
|
|
17 out how full a given disk is. There is an old API that can't
|
|
18 handle disks bigger than 2G, and a new API that isn't always
|
|
19 available. */
|
|
20
|
|
21 #include "win32.h"
|
|
22 #include "diskfull.h"
|
|
23
|
|
24 typedef BOOL (WINAPI * GDFS)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER,
|
|
25 PULARGE_INTEGER);
|
|
26
|
|
27 int
|
|
28 diskfull (char *path)
|
|
29 {
|
|
30 GDFS gdfs = 0;
|
|
31
|
|
32 HINSTANCE k = LoadLibrary ("KERNEL32.DLL");
|
|
33 if (k)
|
|
34 {
|
|
35 gdfs = (GDFS) GetProcAddress (k, "GetDiskFreeSpaceExA");
|
|
36
|
|
37 if (gdfs)
|
|
38 {
|
|
39 ULARGE_INTEGER avail, total, free;
|
|
40 if (gdfs (path, &avail, &total, &free))
|
|
41 {
|
|
42 int perc = avail.QuadPart * 100 / total.QuadPart;
|
|
43 return 100-perc;
|
|
44 }
|
|
45 }
|
|
46 }
|
|
47
|
|
48 char root[4];
|
|
49 if (path[1] != ':')
|
|
50 return 0;
|
|
51
|
|
52 root[0] = path[0];
|
|
53 root[1] = ':';
|
|
54 root[2] = '\\';
|
|
55 root[3] = 0;
|
|
56
|
|
57 DWORD junk, free_clusters, total_clusters;
|
|
58
|
|
59 if (GetDiskFreeSpace (root, &junk, &junk, &free_clusters, &total_clusters))
|
|
60 {
|
|
61 int perc = free_clusters * 100 / total_clusters;
|
|
62 return 100-perc;
|
|
63 }
|
|
64
|
|
65 return 0;
|
|
66 }
|