Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

странности FindFirst


Страницы:   1 2 3

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)
> Для примера взял несколько другой пример, например

"Для примера, например, возмём такой пример." из ответов на вступительных экзаменах (журнал Квант).


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо