OSDN Git Service

Fix bugs of displaying icons in the local file list.
[ffftp/ffftp.git] / diskfree.c
1 /*=============================================================================\r
2 *\r
3 *                                               DISKのフリースペースを得る\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define  STRICT\r
31 // IPv6対応\r
32 #include <winsock2.h>\r
33 #include <windows.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include <string.h>\r
37 #include <mbstring.h>\r
38 #include <malloc.h>\r
39 #include <windowsx.h>\r
40 // IPv6対応\r
41 //#include <winsock.h>\r
42 \r
43 #include "common.h"\r
44 #include "resource.h"\r
45 \r
46 \r
47 typedef DWORD (WINAPI*FUNC_GETDISKFREESPACEEX) (LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);\r
48 \r
49 /*===== ローカルなワーク =====*/\r
50 \r
51 static HINSTANCE m_hDll = NULL;\r
52 \r
53 static FUNC_GETDISKFREESPACEEX m_GetDiskFreeSpaceEx = NULL;\r
54 \r
55 \r
56 \r
57 /*----- KERNEL32をロードする --------------------------------------------------\r
58 *\r
59 *       Parameter\r
60 *               なし\r
61 *\r
62 *       Return Value\r
63 *               なし\r
64 *----------------------------------------------------------------------------*/\r
65 \r
66 void LoadKernelLib(void)\r
67 {\r
68         OSVERSIONINFO VerInfo;\r
69 \r
70         VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
71         GetVersionEx(&VerInfo);\r
72         if(((VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (VerInfo.dwBuildNumber > 1000)) ||\r
73            (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT))\r
74         {\r
75                 if((m_hDll = LoadLibrary("kernel32.dll")) != NULL)\r
76                 {\r
77                         m_GetDiskFreeSpaceEx = (FUNC_GETDISKFREESPACEEX)GetProcAddress(m_hDll, "GetDiskFreeSpaceExA");\r
78 \r
79                         if(m_GetDiskFreeSpaceEx == NULL)\r
80                         {\r
81                                 FreeLibrary(m_hDll);\r
82                                 m_hDll = NULL;\r
83                         }\r
84                 }\r
85         }\r
86         return;\r
87 }\r
88 \r
89 \r
90 /*----- KERNEL32をリリースする -------------------------------------------------\r
91 *\r
92 *       Parameter\r
93 *               なし\r
94 *\r
95 *       Return Value\r
96 *               なし\r
97 *----------------------------------------------------------------------------*/\r
98 \r
99 void ReleaseKernelLib(void)\r
100 {\r
101         if(m_hDll != NULL)\r
102                 FreeLibrary(m_hDll);\r
103         m_hDll = NULL;\r
104 \r
105         return;\r
106 }\r
107 \r
108 \r
109 /*----- フリーエリアのサイズを表わす文字列を返す-------------------------------\r
110 *\r
111 *       Parameter\r
112 *               char *Path : パス名\r
113 *\r
114 *       Return Value\r
115 *               char *文字列\r
116 *----------------------------------------------------------------------------*/\r
117 \r
118 char *AskLocalFreeSpace(char *Path)\r
119 {\r
120         DWORD SectClus;\r
121         DWORD ByteSect;\r
122         DWORD FreeClus;\r
123         DWORD AllClus;\r
124         ULARGE_INTEGER a;\r
125         ULARGE_INTEGER b;\r
126         ULARGE_INTEGER c;\r
127         double Free;\r
128         static char Buf[40];\r
129 \r
130         strcpy(Buf, "??");\r
131         if(*(Path+1) == ':')\r
132         {\r
133                 strncpy(Buf, Path, 2);\r
134                 strcpy(Buf+2, "\\");\r
135 \r
136                 if(m_GetDiskFreeSpaceEx != NULL)\r
137                 {\r
138                         if((*m_GetDiskFreeSpaceEx)(Buf, &a, &b, &c) != 0)\r
139                         {\r
140                                 _ui64toa(a.QuadPart, Buf, 10);\r
141                                 Free = atof(Buf);\r
142                                 MakeSizeString(Free, Buf);\r
143                         }\r
144                         else\r
145                                 strcpy(Buf, "??");\r
146                 }\r
147                 else\r
148                 {\r
149                         if(GetDiskFreeSpace(Buf, &SectClus, &ByteSect, &FreeClus, &AllClus) == TRUE)\r
150                         {\r
151                                 Free = SectClus * ByteSect * FreeClus;\r
152                                 MakeSizeString(Free, Buf);\r
153                         }\r
154                         else\r
155                                 strcpy(Buf, "??");\r
156                 }\r
157         }\r
158         return(Buf);\r
159 }\r
160 \r
161 \r