2 * ATTRIB.C - attrib internal command.
7 * 04-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
10 * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
11 * implementation works, except recursion ("attrib /s").
13 * 05-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
15 * fixed recursion ("attrib /s").
16 * started directory support ("attrib /s /d").
19 * 14-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
22 * 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
25 * 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
26 * Added check for invalid filenames.
28 * 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
29 * Added handling of multiple filenames.
31 * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
32 * Remove all hardcode string to En.rc
38 #ifdef INCLUDE_CMD_ATTRIB
42 PrintAttribute (LPTSTR pszPath
, LPTSTR pszFile
, BOOL bRecurse
)
44 WIN32_FIND_DATA findData
;
46 TCHAR szFullName
[MAX_PATH
];
49 /* prepare full file name buffer */
50 _tcscpy (szFullName
, pszPath
);
51 pszFileName
= szFullName
+ _tcslen (szFullName
);
53 /* display all subdirectories */
56 /* append file name */
57 _tcscpy (pszFileName
, pszFile
);
59 hFind
= FindFirstFile (szFullName
, &findData
);
60 if (hFind
== INVALID_HANDLE_VALUE
)
62 ErrorMessage (GetLastError (), pszFile
);
68 if (!(findData
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
))
71 if (!_tcscmp (findData
.cFileName
, _T(".")) ||
72 !_tcscmp (findData
.cFileName
, _T("..")))
75 _tcscpy (pszFileName
, findData
.cFileName
);
76 _tcscat (pszFileName
, _T("\\"));
77 PrintAttribute (szFullName
, pszFile
, bRecurse
);
79 while (FindNextFile (hFind
, &findData
));
83 /* append file name */
84 _tcscpy (pszFileName
, pszFile
);
86 /* display current directory */
87 hFind
= FindFirstFile (szFullName
, &findData
);
88 if (hFind
== INVALID_HANDLE_VALUE
)
90 ErrorMessage (GetLastError (), pszFile
);
96 if (findData
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
)
99 _tcscpy (pszFileName
, findData
.cFileName
);
101 ConOutPrintf (_T("%c %c%c%c %s\n"),
102 (findData
.dwFileAttributes
& FILE_ATTRIBUTE_ARCHIVE
) ? _T('A') : _T(' '),
103 (findData
.dwFileAttributes
& FILE_ATTRIBUTE_SYSTEM
) ? _T('S') : _T(' '),
104 (findData
.dwFileAttributes
& FILE_ATTRIBUTE_HIDDEN
) ? _T('H') : _T(' '),
105 (findData
.dwFileAttributes
& FILE_ATTRIBUTE_READONLY
) ? _T('R') : _T(' '),
108 while (FindNextFile (hFind
, &findData
));
114 ChangeAttribute (LPTSTR pszPath
, LPTSTR pszFile
, DWORD dwMask
,
115 DWORD dwAttrib
, BOOL bRecurse
, BOOL bDirectories
)
117 WIN32_FIND_DATA findData
;
120 TCHAR szFullName
[MAX_PATH
];
124 /* prepare full file name buffer */
125 _tcscpy (szFullName
, pszPath
);
126 pszFileName
= szFullName
+ _tcslen (szFullName
);
128 /* change all subdirectories */
131 /* append file name */
132 _tcscpy (pszFileName
, _T("*.*"));
134 hFind
= FindFirstFile (szFullName
, &findData
);
135 if (hFind
== INVALID_HANDLE_VALUE
)
137 ErrorMessage (GetLastError (), pszFile
);
144 if (findData
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
)
146 if (!_tcscmp (findData
.cFileName
, _T(".")) ||
147 !_tcscmp (findData
.cFileName
, _T("..")))
150 _tcscpy (pszFileName
, findData
.cFileName
);
151 _tcscat (pszFileName
, _T("\\"));
153 ChangeAttribute (szFullName
, pszFile
, dwMask
,
154 dwAttrib
, bRecurse
, bDirectories
);
157 while (FindNextFile (hFind
, &findData
));
161 /* append file name */
162 _tcscpy (pszFileName
, pszFile
);
164 hFind
= FindFirstFile (szFullName
, &findData
);
165 if (hFind
== INVALID_HANDLE_VALUE
)
167 ErrorMessage (GetLastError (), pszFile
);
174 if (findData
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
)
177 _tcscpy (pszFileName
, findData
.cFileName
);
179 dwAttribute
= GetFileAttributes (szFullName
);
181 if (dwAttribute
!= 0xFFFFFFFF)
183 dwAttribute
= (dwAttribute
& ~dwMask
) | dwAttrib
;
184 SetFileAttributes (szFullName
, dwAttribute
);
187 while (FindNextFile (hFind
, &findData
));
192 INT
CommandAttrib (LPTSTR cmd
, LPTSTR param
)
196 TCHAR szPath
[MAX_PATH
];
197 TCHAR szFileName
[MAX_PATH
];
198 BOOL bRecurse
= FALSE
;
199 BOOL bDirectories
= FALSE
;
203 /* initialize strings */
204 szPath
[0] = _T('\0');
205 szFileName
[0] = _T('\0');
208 if (!_tcsncmp (param
, _T("/?"), 2))
210 ConOutResPaging(TRUE
,STRING_ATTRIB_HELP
);
216 /* build parameter array */
217 arg
= split (param
, &argc
, FALSE
);
219 /* check for options */
220 for (i
= 0; i
< argc
; i
++)
222 if (_tcsicmp (arg
[i
], _T("/s")) == 0)
224 else if (_tcsicmp (arg
[i
], _T("/d")) == 0)
228 /* create attributes and mask */
229 for (i
= 0; i
< argc
; i
++)
231 if (*arg
[i
] == _T('+'))
233 if (_tcslen (arg
[i
]) != 2)
235 error_invalid_parameter_format (arg
[i
]);
240 switch ((TCHAR
)_totupper (arg
[i
][1]))
243 dwMask
|= FILE_ATTRIBUTE_ARCHIVE
;
244 dwAttrib
|= FILE_ATTRIBUTE_ARCHIVE
;
248 dwMask
|= FILE_ATTRIBUTE_HIDDEN
;
249 dwAttrib
|= FILE_ATTRIBUTE_HIDDEN
;
253 dwMask
|= FILE_ATTRIBUTE_READONLY
;
254 dwAttrib
|= FILE_ATTRIBUTE_READONLY
;
258 dwMask
|= FILE_ATTRIBUTE_SYSTEM
;
259 dwAttrib
|= FILE_ATTRIBUTE_SYSTEM
;
263 error_invalid_parameter_format (arg
[i
]);
268 else if (*arg
[i
] == _T('-'))
270 if (_tcslen (arg
[i
]) != 2)
272 error_invalid_parameter_format (arg
[i
]);
277 switch ((TCHAR
)_totupper (arg
[i
][1]))
280 dwMask
|= FILE_ATTRIBUTE_ARCHIVE
;
281 dwAttrib
&= ~FILE_ATTRIBUTE_ARCHIVE
;
285 dwMask
|= FILE_ATTRIBUTE_HIDDEN
;
286 dwAttrib
&= ~FILE_ATTRIBUTE_HIDDEN
;
290 dwMask
|= FILE_ATTRIBUTE_READONLY
;
291 dwAttrib
&= ~FILE_ATTRIBUTE_READONLY
;
295 dwMask
|= FILE_ATTRIBUTE_SYSTEM
;
296 dwAttrib
&= ~FILE_ATTRIBUTE_SYSTEM
;
300 error_invalid_parameter_format (arg
[i
]);
311 len
= GetCurrentDirectory (MAX_PATH
, szPath
);
312 if (szPath
[len
-1] != _T('\\'))
314 szPath
[len
] = _T('\\');
317 _tcscpy (szFileName
, _T("*.*"));
318 PrintAttribute (szPath
, szFileName
, bRecurse
);
323 /* get full file name */
324 for (i
= 0; i
< argc
; i
++)
326 if ((*arg
[i
] != _T('+')) && (*arg
[i
] != _T('-')) && (*arg
[i
] != _T('/')))
329 GetFullPathName (arg
[i
], MAX_PATH
, szPath
, NULL
);
330 p
= _tcsrchr (szPath
, _T('\\')) + 1;
331 _tcscpy (szFileName
, p
);
335 PrintAttribute (szPath
, szFileName
, bRecurse
);
337 ChangeAttribute (szPath
, szFileName
, dwMask
,
338 dwAttrib
, bRecurse
, bDirectories
);
346 #endif /* INCLUDE_CMD_ATTRIB */