OSDN Git Service

Add routines for IPv6.
[ffftp/ffftp.git] / local.c
1 /*=============================================================================\r
2 *\r
3 *                                               ローカル側のファイルアクセス\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 #include <windows.h>\r
32 #include <stdio.h>\r
33 #include <stdlib.h>\r
34 #include <direct.h>\r
35 #include <string.h>\r
36 #include <windowsx.h>\r
37 \r
38 #include "common.h"\r
39 #include "resource.h"\r
40 \r
41 \r
42 \r
43 /*----- ローカル側のディレクトリ変更 -------------------------------------------\r
44 *\r
45 *       Parameter\r
46 *               char *Path : パス名\r
47 *\r
48 *       Return Value\r
49 *               int ステータス\r
50 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
51 *----------------------------------------------------------------------------*/\r
52 \r
53 int DoLocalCWD(char *Path)\r
54 {\r
55         int Sts;\r
56 \r
57         Sts = FFFTP_SUCCESS;\r
58         SetTaskMsg(">>CD %s", Path);\r
59         if(SetCurrentDirectory(Path) != TRUE)\r
60         {\r
61                 SetTaskMsg(MSGJPN145);\r
62                 Sts = FFFTP_FAIL;\r
63         }\r
64         return(Sts);\r
65 }\r
66 \r
67 \r
68 /*----- ローカル側のディレクトリ作成 -------------------------------------------\r
69 *\r
70 *       Parameter\r
71 *               char *Path : パス名\r
72 *\r
73 *       Return Value\r
74 *               なし\r
75 *----------------------------------------------------------------------------*/\r
76 \r
77 void DoLocalMKD(char *Path)\r
78 {\r
79         SetTaskMsg(">>MKDIR %s", Path);\r
80         if(_mkdir(Path) != 0)\r
81                 SetTaskMsg(MSGJPN146);\r
82         return;\r
83 }\r
84 \r
85 \r
86 /*----- ローカル側のカレントディレクトリ取得 -----------------------------------\r
87 *\r
88 *       Parameter\r
89 *               char *Buf : パス名を返すバッファ\r
90 *\r
91 *       Return Value\r
92 *               なし\r
93 *----------------------------------------------------------------------------*/\r
94 \r
95 void DoLocalPWD(char *Buf)\r
96 {\r
97         if(GetCurrentDirectory(FMAX_PATH, Buf) == 0)\r
98                 strcpy(Buf, "");\r
99         return;\r
100 }\r
101 \r
102 \r
103 /*----- ローカル側のディレクトリ削除 ------------------------------------------\r
104 *\r
105 *       Parameter\r
106 *               char *Path : パス名\r
107 *\r
108 *       Return Value\r
109 *               なし\r
110 *----------------------------------------------------------------------------*/\r
111 \r
112 void DoLocalRMD(char *Path)\r
113 {\r
114 #if 0\r
115         SetTaskMsg(">>RMDIR %s", Path);\r
116         if(rmdir(Path) != 0)\r
117                 SetTaskMsg(MSGJPN147);\r
118 #else\r
119         SetTaskMsg(">>RMDIR %s", Path);\r
120 \r
121         if(MoveFileToTrashCan(Path) != 0)\r
122                 SetTaskMsg(MSGJPN148);\r
123 #endif\r
124         return;\r
125 }\r
126 \r
127 \r
128 /*----- ローカル側のファイル削除 -----------------------------------------------\r
129 *\r
130 *       Parameter\r
131 *               char *Path : パス名\r
132 *\r
133 *       Return Value\r
134 *               なし\r
135 *----------------------------------------------------------------------------*/\r
136 \r
137 void DoLocalDELE(char *Path)\r
138 {\r
139 #if 0\r
140         SetTaskMsg(">>DEL %s", Path);\r
141         if(DeleteFile(Path) != TRUE)\r
142                 SetTaskMsg(MSGJPN149);\r
143 #else\r
144         SetTaskMsg(">>DEL %s", Path);\r
145 \r
146         if(MoveFileToTrashCan(Path) != 0)\r
147                 SetTaskMsg(MSGJPN150);\r
148 #endif\r
149         return;\r
150 }\r
151 \r
152 \r
153 /*----- ローカル側のファイル名変更 ---------------------------------------------\r
154 *\r
155 *       Parameter\r
156 *               char *Src : 元ファイル名\r
157 *               char *Dst : 変更後のファイル名\r
158 *\r
159 *       Return Value\r
160 *               なし\r
161 *----------------------------------------------------------------------------*/\r
162 \r
163 void DoLocalRENAME(char *Src, char *Dst)\r
164 {\r
165         SetTaskMsg(">>REN %s %s", Src, Dst);\r
166         if(MoveFile(Src, Dst) != TRUE)\r
167                 SetTaskMsg(MSGJPN151);\r
168         return;\r
169 }\r
170 \r
171 \r
172 /*----- ファイルのプロパティを表示する ----------------------------------------\r
173 *\r
174 *       Parameter\r
175 *               char *Fname : ファイル名\r
176 *\r
177 *       Return Value\r
178 *               なし\r
179 *----------------------------------------------------------------------------*/\r
180 \r
181 void DispFileProperty(char *Fname)\r
182 {\r
183         SHELLEXECUTEINFO sInfo;\r
184         // 異なるファイルが表示されるバグ修正\r
185         // 詳細は不明だが末尾に半角スペースを置くと拡張子の補完がされなくなる\r
186         char Fname2[FMAX_PATH+1];\r
187 \r
188         memset(&sInfo, NUL, sizeof(SHELLEXECUTEINFO));\r
189         sInfo.cbSize = sizeof(SHELLEXECUTEINFO);\r
190         sInfo.fMask = SEE_MASK_INVOKEIDLIST;\r
191         sInfo.hwnd = NULL;              //GetMainHwnd();\r
192         sInfo.lpVerb = "Properties";\r
193         // 異なるファイルが表示されるバグ修正\r
194 //      sInfo.lpFile = Fname;\r
195         strcpy(Fname2, Fname);\r
196         strcat(Fname2, " ");\r
197         sInfo.lpFile = Fname2;\r
198         sInfo.lpParameters = NULL;\r
199         sInfo.lpDirectory = NULL;\r
200         sInfo.nShow = SW_NORMAL;\r
201         sInfo.lpIDList = NULL;\r
202         ShellExecuteEx(&sInfo);\r
203         return;\r
204 }\r
205 \r
206 \r
207 /*----- 属性をチェックする FindFirstFile --------------------------------------\r
208 *\r
209 *       Parameter\r
210 *               char *Fname : ファイル名\r
211 *               WIN32_FIND_DATA *FindData : 検索データ\r
212 *               int IgnHide : 隠しファイルを無視するかどうか(YES/NO)\r
213 *\r
214 *       Return Value\r
215 *               HANDLE ハンドル\r
216 *----------------------------------------------------------------------------*/\r
217 \r
218 HANDLE FindFirstFileAttr(char *Fname, WIN32_FIND_DATA *FindData, int IgnHide)\r
219 {\r
220         HANDLE hFind;\r
221 \r
222         if((hFind = FindFirstFile(Fname, FindData)) != INVALID_HANDLE_VALUE)\r
223         {\r
224                 if(IgnHide == YES)\r
225                 {\r
226                         while(FindData->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)\r
227                         {\r
228                                 if(FindNextFile(hFind, FindData) == FALSE)\r
229                                 {\r
230                                         FindClose(hFind);\r
231                                         hFind = INVALID_HANDLE_VALUE;\r
232                                         break;\r
233                                 }\r
234                         }\r
235                 }\r
236         }\r
237         return(hFind);\r
238 }\r
239 \r
240 \r
241 /*----- 属性をチェックする FindNextFile ---------------------------------------\r
242 *\r
243 *       Parameter\r
244 *               HANDLE hFind : ハンドル\r
245 *               WIN32_FIND_DATA *FindData : 検索データ\r
246 *               int IgnHide : 隠しファイルを無視するかどうか(YES/NO)\r
247 *\r
248 *       Return Value\r
249 *               HANDLE ハンドル\r
250 *----------------------------------------------------------------------------*/\r
251 \r
252 BOOL FindNextFileAttr(HANDLE hFind, WIN32_FIND_DATA *FindData, int IgnHide)\r
253 {\r
254         BOOL Ret;\r
255 \r
256         while((Ret = FindNextFile(hFind, FindData)) == TRUE)\r
257         {\r
258                 if(IgnHide == NO)\r
259                         break;\r
260                 if((FindData->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)\r
261                         break;\r
262         }\r
263         return(Ret);\r
264 }\r
265 \r
266 \r