![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
странности FindFirst
wp2 © (2011-12-13 16:45:00)задача была найти файлы типа фывфыва001фываывфа
фвафыва002фывафыва
фывафыва003фвыафыва
фывафыва004фывафыва
и т.д.
и соответственно их переименовать по нужному принципу
function AddZero(a: Integer): String;//добавление
передних нулей
var i: Integer;
s: String;
begin
s := IntToStr(a);
for i := 1 to 3 - Length(s) do
s := '0' + s;
AddZero := s;
end;
//основной код
for i := 1 to 118 do
begin
Zero := AddZero(i);
R := FindFirst(Dir + '*' + Zero + '*', faAnyFile, Find);
//обработка файла
FindClose(Find);
end;
Всё работает, но...
вы не поверите, то файлы 004, 014 не находит! Точнее находит но не их! А какой-нибудь 186, например. Переменная R = 0.
wp2 (2011-12-14 22:37:00) [21]всё таки Винда виновата?
у меня win2003server (так, от нечего делать поставил).
sniknik (2011-12-14 22:35:00) [22]> эх, если бы кто-то сам у себя на компе попробовал...
sniknik © (13.12.11 21:18) [13]
> странно, проверил, не заполняется у меня cAlternateFileName ... не находится по короткому имени поэтому значит... винда XP. D7.
sniknik © (13.12.11 21:31) [14]
> а, по моему понял/вспомнил на ntfs подобного нет. или нет...?
wp2 (2011-12-14 21:48:00) [23]была и такая идея)
тогда уже bat-файл лучше написать :)
эх, если бы кто-то сам у себя на компе попробовал... Исходник на С языке я дал. Осталось только написать прогу, создающую файлы asdfasdf001asdfasdf...asdfasdf238asdfasdf
MBo (2011-12-14 21:23:00) [24]>если я каждый из них буду так искать, то количество поисков будет максимум 200х200.
Другой путь - перебрать все файлы, переименовать каждый, подлежащий переименованию, как надо
wp2 (2011-12-14 21:18:00) [25][I]>значит надо вызывать FindNext, чтобы найти их.[/I]
можно конечно, если не тот результат, то зациклить FindNext до выдачи нужного. Но, у меня 200 файлов, если я каждый из них буду так искать, то количество поисков будет максимум 200х200. Весело :)
wp2 (2011-12-14 21:11:00) [26]у меня ж задача обрабатывать файлы типа asdfasdf001asdfasdf
то есть, они должны идти по очереди (там есть нюансы в обработке). Я конечно могу использовать FindNext, но я ж не знаю, какой оно файл найдёт. Придётся присать огромный case...
Ясно видно, что маска *число* не всегда работает.
#include
#include
void main(void)
{
WIN32_FIND_DATA FindData;
HANDLE h;
char *name, *Search;
name = (char *)malloc(100);
Search = (char *)malloc(100);
printf("path = "); scanf("%s", name);
strcpy(Search, "*004*");
h = FindFirstFile(strcat(name, Search), &FindData);
printf("h = %i\n", h);
printf("%s", FindData.cFileName);
}
выводит:
path = C:\a\
h=1319168
asdfasdf185asdfasdf
пока отбой. Будем считать проблему не решенной.
MBo (2011-12-14 21:01:00) [27]>В Delphi 7 нет такого.
У, оно вообще с Win7 только введено, тогда отбой.'
Видимо, остаётся то, что давно сказали:
>4. Раз находит, но не их, значит надо вызывать FindNext, чтобы найти их.
wp2 (2011-12-14 20:46:00) [28]
> MBo © (14.12.11 20:10) [26]
> а FindExInfoBasic ?
В Delphi 7 нет такого.
Windows.pas
_FINDEX_INFO_LEVELS = (FindExInfoStandard, FindExInfoMaxInfoLevel);
wp2 (2011-12-14 20:12:00) [29]
var Se: WideString;
Search: PWideChar;
R: Integer;
FindData: WIN32_FIND_DATAW;
begin
Zero := '004';
Se := Dir + '*' + Zero + '*';
Search := PWideChar(Se);
R := FindFirstFileW(Search, FindData);
проблема не решилась.
MBo (2011-12-14 20:10:00) [30]а FindExInfoBasic ?
wp2 (2011-12-14 19:51:00) [31]
> MBo © (13.12.11 20:43) [12]
> файл "фывфыва014фываывфа" получает короткое имя вроде "фывф~001"Стоит
> попробовать FindFirstFileEx и с infolevel разобраться (у
> меня не открывается описание его значений)
с параметром FindExInfoStandard всё так же само. С параметром FindExInfoMaxInfoLevel вообще ничего не находит.
Плохиш (2011-12-14 19:08:00) [32]
> Германн © (14.12.11 01:35) [19]
Судя по [22] пациент безнадёжен :-)
han_malign (2011-12-14 17:47:00) [33]
> это ж всё для Юникода...
- угу, который работает без ограничения MAX_PATH...
wp2 (2011-12-14 02:18:00) [34]
> Плохиш © (14.12.11 00:48) [17]
это ж всё для Юникода...
wp2 (2011-12-14 02:15:00) [35]
> > [15] wp2 (13.12.11 23:31)> Для примера взял несколько
> другой пример, например "Для примера, например, возмём такой
> пример." из ответов на вступительных экзаменах (журнал Квант).
>
у меня есть проблема, когда я программирую, то не могу и двух слов связать. Мне даже написать на листе бумаги что-то сложно. Потом разобрать не могу)
sniknik (2011-12-14 01:40:00) [36]+ сделай пример с функциями -GetShortFileName/Path, GetLongFileName/Path
Германн (2011-12-14 01:35:00) [37]
> Плохиш © (14.12.11 00:48) [17]
Что-то ты сегодня лишком добрый :)
sniknik (2011-12-14 01:34:00) [38]> почему именно тот случай не работал, так и не понял.
см.
MBo © (13.12.11 20:43) [12]
Плохиш (2011-12-14 00:48:00) [39]
> wp2 (13.12.11 16:45)
Вот эти функции попробуй
{$WARN SYMBOL_PLATFORM OFF}
unit SysUtilsW;
interface
uses
Windows;
type
TSearchRecW = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: WideString;
ExcludeAttr: Integer;
FindHandle: THandle platform;
FindData: TWin32FindDataW platform;
end;
// From SysUtils
LongRec = packed record
case Integer of
0: (Lo, Hi: Word);
1: (Words: array [0..1] of Word);
2: (Bytes: array [0..3] of Byte);
end;
const
{ File attribute constants }
faReadOnly = $00000001 platform;
faHidden = $00000002 platform;
faSysFile = $00000004 platform;
faVolumeID = $00000008 platform;
faDirectory = $00000010;
faArchive = $00000020 platform;
faSymLink = $00000040 platform;
faAnyFile = $0000003F;
procedure FindCloseW(var F: TSearchRecW);
function FindFirstW(const Path: WideString; Attr: Integer; var F: TSearchRecW): Integer;
function FindNextW(var F: TSearchRecW): Integer;
function WideCharToChar(const WCh: WideChar): String;
function WideStringToTranslit(const WString: WideString): String;
implementation
function FindMatchingFileW(var F: TSearchRecW): Integer;
var
LocalFileTime: TFileTime;
begin
with F do
begin
while FindData.dwFileAttributes and ExcludeAttr <> 0 do
if not FindNextFileW(FindHandle, FindData) then
begin
Result := GetLastError;
Exit;
end;
FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo);
Size := FindData.nFileSizeLow;
Attr := FindData.dwFileAttributes;
Name := FindData.cFileName;
end;
Result := 0;
end;
procedure FindCloseW(var F: TSearchRecW);
begin
if F.FindHandle <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(F.FindHandle);
F.FindHandle := INVALID_HANDLE_VALUE;
end;
end;
function FindFirstW(const Path: WideString; Attr: Integer;
var F: TSearchRecW): Integer;
const
faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
begin
F.ExcludeAttr := not Attr and faSpecial;
F.FindHandle := FindFirstFileW(PWideChar(Path), F.FindData);
if F.FindHandle <> INVALID_HANDLE_VALUE then
begin
Result := FindMatchingFileW(F);
if Result <> 0 then FindCloseW(F);
end else
Result := GetLastError;
end;
function FindNextW(var F: TSearchRecW): Integer;
begin
if FindNextFileW(F.FindHandle, F.FindData) then
Result := FindMatchingFileW(F) else
Result := GetLastError;
end;
Inovet (2011-12-14 00:07:00) [40]> [15] wp2 (13.12.11 23:31)
> Для примера взял несколько другой пример, например
"Для примера, например, возмём такой пример." из ответов на вступительных экзаменах (журнал Квант).