` Loop through all files on drive with unicode support (Menno De Ruiter) - Icetips Article
Icetips - Templates, Tools & Utilities for Clarion Developers

Templates, Tools and Utilities
for Clarion Developers

Icetips Article

Back to article list   Search Articles     Add Comment     Printer friendly     Direct link  

Windows API: Loop through all files on drive with unicode support
2006-11-21 -- Menno De Ruiter
 
I thought I post a post which loops / enumerates all files and dirs on the hd, I had the problem first of the 260 path limitation, but the unicode api's can handle path > 32k length, The routine does not include parse situations, but is okay for general use etc. It also converts the file time into your local time thus UTC + bias SystemTimeToTzSpecificLocalTime etc. TheRoutine routine data TIME_ZONE_INFORMATION Group,pre() TZI:Bias Long TZI:StandardName String(32) TZI:STYear USHORT TZI:STMonth USHORT TZI:STDayOfWeek USHORT TZI:STDay USHORT TZI:STHour USHORT TZI:STMinute USHORT TZI:STSecond USHORT TZI:STMilliseconds USHORT TZI:StandardBias Long TZI:DaylightName String(32) TZI:DDYear USHORT TZI:DDMonth USHORT TZI:DDDayOfWeek USHORT TZI:DDDay USHORT TZI:DDHour USHORT TZI:DDMinute USHORT TZI:DDSecond USHORT TZI:DDMilliseconds USHORT TZI:DaylightBias LONG TZI:Extra String(1024) End FileTime Group,pre() LowDateTime ULong HighDateTime ULong End IFileTime Group,pre() ILowDateTime ULong IHighDateTime ULong End ReturnVal Long GSYSTEMTIME GROUP,PRE() GST:wYear USHORT GST:wMonth USHORT GST:wDayOfWeek USHORT GST:wDay USHORT GST:wHour USHORT GST:wMinute USHORT GST:wSecond USHORT GST:wMilliseconds USHORT END OGSYSTEMTIME GROUP,PRE() OGST:wYear USHORT OGST:wMonth USHORT OGST:wDayOfWeek USHORT OGST:wDay USHORT OGST:wHour USHORT OGST:wMinute USHORT OGST:wSecond USHORT OGST:wMilliseconds USHORT END WIFindData Group,pre() WIFD:FileAttrib Ulong WIFD:CreateTimeLow ulong WIFD:CreateTimeHigh ulong WIFD:LastAccessTimeLow ulong WIFD:LastAccessTimeHigh ulong WIFD:LastWriteTimeLow ulong WIFD:LastWriteTimeHigh ulong WIFD:FileSizeHigh ULong WIFD:FileSizeLow ULong WIFD:Reserved0 ULong WIFD:Reserved1 ULong WIFD:FileName String(65536) WIFD:AlternateFileName String(14) End WOFindData Group,pre() WOFD:FileAttrib Ulong WOFD:CreateTimeLow ulong WOFD:CreateTimeHigh ulong WOFD:LastAccessTimeLow ulong WOFD:LastAccessTimeHigh ulong WOFD:LastWriteTimeLow ulong WOFD:LastWriteTimeHigh ulong WOFD:FileSizeHigh ULong WOFD:FileSizeLow ULong WOFD:Reserved0 ULong WOFD:Reserved1 ULong WOFD:FileName String(65536) WOFD:AlternateFileName String(14) End WWLocalFile String(65536) AIFindData Group,pre() AIFD:FileAttrib Ulong AIFD:CreateTimeLow ulong AIFD:CreateTimeHigh ulong AIFD:LastAccessTimeLow ulong AIFD:LastAccessTimeHigh ulong AIFD:LastWriteTimeLow ulong AIFD:LastWriteTimeHigh ulong AIFD:FileSizeHigh ULong AIFD:FileSizeLow ULong AIFD:Reserved0 ULong AIFD:Reserved1 ULong AIFD:FileName String(260) AIFD:AlternateFileName String(14) End AOFindData Group,pre() AOFD:FileAttrib Ulong AOFD:CreateTimeLow ulong AOFD:CreateTimeHigh ulong AOFD:LastAccessTimeLow ulong AOFD:LastAccessTimeHigh ulong AOFD:LastWriteTimeLow ulong AOFD:LastWriteTimeHigh ulong AOFD:FileSizeHigh ULong AOFD:FileSizeLow ULong AOFD:Reserved0 ULong AOFD:Reserved1 ULong AOFD:FileName String(260) AOFD:AlternateFileName String(14) End ALocalFile String(260) ERROR_FILE_NOT_FOUND Equate(2) ERROR_ACCESS_DENIED Equate(5) TIME_ZONE_ID_INVALID Equate(0FFFFFFFFh) TIME_ZONE_ID_UNKNOWN Equate(0h) TIME_ZONE_ID_STANDARD Equate(1h) TIME_ZONE_ID_DAYLIGHT Equate(2h) !GetTimeZoneInformation(long),long,raw,pascal ZoneInformation long ERROR_NO_MORE_FILES equate(18) LocalFileHandleNew long CurrentQTDirsToDoPosition ULong CurrentQTDirsPosition Ulong code ZoneInformation = GetTimeZoneInformation(Address(TIME_ZONE_INFORMATION)) !! Case ZoneInformation !! Of TIME_ZONE_ID_UNKNOWN !! !Message('TIME_ZONE_ID_UNKNOWN') !! Of TIME_ZONE_ID_STANDARD !! !Message('TIME_ZONE_ID_STANDARD') !! Of TIME_ZONE_ID_DAYLIGHT !! !Message('TIME_ZONE_ID_DAYLIGHT') !! End CurrentQTDirsPosition = 0 LocalRootDir = 'c:\' LocalCurrentPath = Clip(LocalRootDir) LocalRootDir = Clip(LocalRootDir) & '*.*' ALocalFile = '\\?\' & Clip(LocalRootDir) & Chr(0) Clear(AIFindData) Clear(AOFindData) Clear(WIFindData) Clear(WOFindData) Clear(WWLocalFile) L# = MultiByteToWideChar(CP_THREAD_ACP,0,Address(ALocalFile),Len(Clip(ALocalFile)),Address(WWLocalFile),0) R# = MultiByteToWideChar(CP_THREAD_ACP,0,Address(ALocalFile),Len(Clip(ALocalFile)),Address(WWLocalFile),L#) LocalFileHandle = FindFirstFileExW(Address(WWLocalFile),0,Address(WOFindData),0,0,0) Case LocalFileHandle Of -1 R# = GetLastError() Message('error ' & R#) Case R# Of ERROR_FILE_NOT_FOUND Message('ERROR_FILE_NOT_FOUND') Of ERROR_ACCESS_DENIED Message('ERROR_ACCESS_DENIED') Else Message('error unknown ' & R#) End End R# = WideCharToMultiByte(CP_ACP,0,Address(WOFD:FileName),Size(WOFD:FileName),Address(ALocalFile),Size(ALocalFile),0,0) !Message(WOFD:FileAttrib) QTFiles:Number = QTFiles:Number + 1 QTFiles:Name = Clip(ALocalFile) QTFiles:QTDirsNumber = 0 QTFiles:FILE_ATTRIBUTE_READONLY = 0 QTFiles:FILE_ATTRIBUTE_HIDDEN = 0 QTFiles:FILE_ATTRIBUTE_SYSTEM = 0 QTFiles:FILE_ATTRIBUTE_DIRECTORY = 0 QTFiles:FILE_ATTRIBUTE_ARCHIVE = 0 QTFiles:FILE_ATTRIBUTE_DEVICE = 0 QTFiles:FILE_ATTRIBUTE_UNKNOWNXXX0 = 0 QTFiles:FILE_ATTRIBUTE_NORMAL = 0 QTFiles:FILE_ATTRIBUTE_TEMPORARY = 0 QTFiles:FILE_ATTRIBUTE_SPARSE_FILE = 0 QTFiles:FILE_ATTRIBUTE_REPARSE_POINT = 0 QTFiles:FILE_ATTRIBUTE_COMPRESSED = 0 QTFiles:FILE_ATTRIBUTE_OFFLINE = 0 QTFiles:FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0 QTFiles:FILE_ATTRIBUTE_ENCRYPTED = 0 If Band(WOFD:FileAttrib,01h) > 0 QTFiles:FILE_ATTRIBUTE_READONLY = True End If Band(WOFD:FileAttrib,02h) > 0 QTFiles:FILE_ATTRIBUTE_HIDDEN = True End If Band(WOFD:FileAttrib,04h) > 0 QTFiles:FILE_ATTRIBUTE_SYSTEM = True End If Band(WOFD:FileAttrib,010h) > 0 QTFiles:FILE_ATTRIBUTE_DIRECTORY = True End If Band(WOFD:FileAttrib,020h) > 0 QTFiles:FILE_ATTRIBUTE_ARCHIVE = True End If Band(WOFD:FileAttrib,040h) > 0 QTFiles:FILE_ATTRIBUTE_DEVICE = True End If Band(WOFD:FileAttrib,060h) > 0 QTFiles:FILE_ATTRIBUTE_UNKNOWNXXX0 = True End If Band(WOFD:FileAttrib,080h) > 0 QTFiles:FILE_ATTRIBUTE_NORMAL = True End If Band(WOFD:FileAttrib,0100h) > 0 QTFiles:FILE_ATTRIBUTE_TEMPORARY = True End If Band(WOFD:FileAttrib,0200h) > 0 QTFiles:FILE_ATTRIBUTE_SPARSE_FILE = True End If Band(WOFD:FileAttrib,0400h) > 0 QTFiles:FILE_ATTRIBUTE_REPARSE_POINT = True End If Band(WOFD:FileAttrib,0800h) > 0 QTFiles:FILE_ATTRIBUTE_COMPRESSED = True End If Band(WOFD:FileAttrib,01000h) > 0 QTFiles:FILE_ATTRIBUTE_OFFLINE = True End If Band(WOFD:FileAttrib,02000h) > 0 QTFiles:FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = True End If Band(WOFD:FileAttrib,04000h) > 0 QTFiles:FILE_ATTRIBUTE_ENCRYPTED = True End QTFiles:CreationTimeString8 = 0 QTFiles:CreationTimeReal = 0 QTFiles:CreationTimeLow = WOFD:CreateTimeLow QTFiles:CreationTimeHigh = WOFD:CreateTimeHigh IFileTime.ILowDateTime = WOFD:CreateTimeLow IFileTime.IHighDateTime = WOFD:CreateTimeHigh ReturnVal = FileTimeToSystemTime(Address(IFileTime),Address(OGSYSTEMTIME)) ReturnVal = SystemTimeToTzSpecificLocalTime(Address(TIME_ZONE_INFORMATION),Address(OGSYSTEMTIME),Address(GSYSTEMTIME)) QTFiles:CreationTimeDate = Deformat(Format(GSYSTEMTIME.GST:wYear,@N04)&Format(GSYSTEMTIME.GST:wMonth,@N02)&Format(GSYSTEMTIME.GST:wDay,@N02),@D12) QTFiles:CreationTimeTime = ((GSYSTEMTIME.GST:wHour * 60 * 60 * 100)+1) + ((GSYSTEMTIME.GST:wMinute * 60 * 100)) + ((GSYSTEMTIME.GST:wSecond * 100)) + (GST:wMilliseconds/100) QTFiles:LastAccessTimeString8 = 0 QTFiles:LastAccessTimeReal = 0 QTFiles:LastAccessTimeLow = WOFD:LastAccessTimeLow QTFiles:LastAccessTimeHigh = WOFD:LastAccessTimeHigh IFileTime.ILowDateTime = WOFD:LastAccessTimeLow IFileTime.IHighDateTime = WOFD:LastAccessTimeHigh ReturnVal = FileTimeToSystemTime(Address(IFileTime),Address(OGSYSTEMTIME)) ReturnVal = SystemTimeToTzSpecificLocalTime(Address(TIME_ZONE_INFORMATION),Address(OGSYSTEMTIME),Address(GSYSTEMTIME)) QTFiles:LastAccessTimeDate = Deformat(Format(GSYSTEMTIME.GST:wYear,@N04)&Format(GSYSTEMTIME.GST:wMonth,@N02)&Format(GSYSTEMTIME.GST:wDay,@N02),@D12) QTFiles:LastAccessTimeTime = ((GSYSTEMTIME.GST:wHour * 60 * 60 * 100)+1) + ((GSYSTEMTIME.GST:wMinute * 60 * 100)) + ((GSYSTEMTIME.GST:wSecond * 100)) + (GST:wMilliseconds/100) QTFiles:LastWriteTimeString8 = 0 QTFiles:LastWriteTimeReal = 0 QTFiles:LastWriteTimeLow = WOFD:LastWriteTimeLow QTFiles:LastWriteTimeHigh = WOFD:LastWriteTimeHigh IFileTime.ILowDateTime = WOFD:LastAccessTimeLow IFileTime.IHighDateTime = WOFD:LastAccessTimeHigh ReturnVal = FileTimeToSystemTime(Address(IFileTime),Address(OGSYSTEMTIME)) ReturnVal = SystemTimeToTzSpecificLocalTime(Address(TIME_ZONE_INFORMATION),Address(OGSYSTEMTIME),Address(GSYSTEMTIME)) QTFiles:LastWriteTimeDate = Deformat(Format(GSYSTEMTIME.GST:wYear,@N04)&Format(GSYSTEMTIME.GST:wMonth,@N02)&Format(GSYSTEMTIME.GST:wDay,@N02),@D12) QTFiles:LastWriteTimeTime = ((GSYSTEMTIME.GST:wHour * 60 * 60 * 100)+1) + ((GSYSTEMTIME.GST:wMinute * 60 * 100)) + ((GSYSTEMTIME.GST:wSecond * 100)) + (GST:wMilliseconds/100) QTFiles:FileSizeString8 = 0 QTFiles:FileSizeLow = WOFD:FileSizeLow QTFiles:FileSizeHigh = WOFD:FileSizeHigh QTFiles:FileSizeReal = (WOFD:FileSizeHigh*256) + WOFD:FileSizeLow QTFiles:DosFileName = WOFD:AlternateFileName If QTFiles:FILE_ATTRIBUTE_DIRECTORY = True QTDirs:Number = QTDirs:Number + 1 QTDirs:QTFilesNumber = QTFiles:Number QTDirs:Name = Clip(LocalCurrentPath) & Clip(QTFiles:Name) QTDirs:QTFilesPosition = Pointer(QTFiles) + 1 Add(QTDirs) QTFiles:QTDirsNumber = QTDirs:Number Else QTFiles:QTDirsNumber = 0 End Add(QTFiles) X# = 1 l1 Loop !5000 Times X# = X# + 1 D# = D# + 1 If D# > 1000 Display D# = 0 End ALocalFile = '\\?\' & Clip(LocalRootDir) & Chr(0) Clear(WOFindData) L# = MultiByteToWideChar(CP_THREAD_ACP,0,Address(ALocalFile),Len(Clip(ALocalFile)),Address(WWLocalFile),0) R# = MultiByteToWideChar(CP_THREAD_ACP,0,Address(ALocalFile),Len(Clip(ALocalFile)),Address(WWLocalFile),L#) R# = FindNextFileW(LocalFileHandle,Address(WOFindData)) If R# < 1 R# = GetLastError() Case R# Of ERROR_FILE_NOT_FOUND Message('ERROR_FILE_NOT_FOUND') Break Of ERROR_ACCESS_DENIED Message('ERROR_ACCESS_DENIED') Break Of ERROR_NO_MORE_FILES Loop 1000 Times CurrentQTDirsPosition = CurrentQTDirsPosition + 1 If CurrentQTDirsPosition > TotalQTDirs break l1 End Get(QTDirs,CurrentQTDirsPosition) N# = Instring(Chr(0),QTDirs:Name,1,1) If N# > 1 QTDirs:Name = QTDirs:Name[1 : N#-1] End LocalCurrentPath = Clip(QTDirs:Name) & '\' LocalRootDir = Clip(QTDirs:Name) & '\*.*' ALocalFile = '\\?\' & Clip(LocalRootDir) & Chr(0) Clear(WOFindData) L# = MultiByteToWideChar(CP_THREAD_ACP,0,Address(ALocalFile),Len(Clip(ALocalFile)),Address(WWLocalFile),0) R# = MultiByteToWideChar(CP_THREAD_ACP,0,Address(ALocalFile),Len(Clip(ALocalFile)),Address(WWLocalFile),L#) LocalFileHandle = FindFirstFileExW(Address(WWLocalFile),0,Address(WOFindData),0,0,0) If LocalFileHandle < 1 Cycle Else Break End End Else !Message('error unknown ' & R#) Break End End Clear(ALocalFile) R# = WideCharToMultiByte(CP_ACP,0,Address(WOFD:FileName),Size(WOFD:FileName),Address(ALocalFile),Size(ALocalFile),0,0) N# = Instring(Chr(0),ALocalFile,1,1) If N# > 1 ALocalFile = ALocalFile[1 : N#-1] End Case Clip(ALocalFile) Of '.' OrOf '..' Cycle End QTFiles:NumberHIGH = QTFiles:NumberHIGH + 1 QTFiles:Number = QTFiles:NumberHIGH QTFiles:Name = Clip(ALocalFile) QTFiles:QTDirsNumber = 0 QTFiles:FILE_ATTRIBUTE_READONLY = 0 QTFiles:FILE_ATTRIBUTE_HIDDEN = 0 QTFiles:FILE_ATTRIBUTE_SYSTEM = 0 QTFiles:FILE_ATTRIBUTE_DIRECTORY = 0 QTFiles:FILE_ATTRIBUTE_ARCHIVE = 0 QTFiles:FILE_ATTRIBUTE_DEVICE = 0 QTFiles:FILE_ATTRIBUTE_UNKNOWNXXX0 = 0 QTFiles:FILE_ATTRIBUTE_NORMAL = 0 QTFiles:FILE_ATTRIBUTE_TEMPORARY = 0 QTFiles:FILE_ATTRIBUTE_SPARSE_FILE = 0 QTFiles:FILE_ATTRIBUTE_REPARSE_POINT = 0 QTFiles:FILE_ATTRIBUTE_COMPRESSED = 0 QTFiles:FILE_ATTRIBUTE_OFFLINE = 0 QTFiles:FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0 QTFiles:FILE_ATTRIBUTE_ENCRYPTED = 0 If Band(WOFD:FileAttrib,01h) > 0 QTFiles:FILE_ATTRIBUTE_READONLY = True End If Band(WOFD:FileAttrib,02h) > 0 QTFiles:FILE_ATTRIBUTE_HIDDEN = True End If Band(WOFD:FileAttrib,04h) > 0 QTFiles:FILE_ATTRIBUTE_SYSTEM = True End If Band(WOFD:FileAttrib,010h) > 0 QTFiles:FILE_ATTRIBUTE_DIRECTORY = True End If Band(WOFD:FileAttrib,020h) > 0 QTFiles:FILE_ATTRIBUTE_ARCHIVE = True End If Band(WOFD:FileAttrib,040h) > 0 QTFiles:FILE_ATTRIBUTE_DEVICE = True End If Band(WOFD:FileAttrib,060h) > 0 QTFiles:FILE_ATTRIBUTE_UNKNOWNXXX0 = True End If Band(WOFD:FileAttrib,080h) > 0 QTFiles:FILE_ATTRIBUTE_NORMAL = True End If Band(WOFD:FileAttrib,0100h) > 0 QTFiles:FILE_ATTRIBUTE_TEMPORARY = True End If Band(WOFD:FileAttrib,0200h) > 0 QTFiles:FILE_ATTRIBUTE_SPARSE_FILE = True End If Band(WOFD:FileAttrib,0400h) > 0 QTFiles:FILE_ATTRIBUTE_REPARSE_POINT = True End If Band(WOFD:FileAttrib,0800h) > 0 QTFiles:FILE_ATTRIBUTE_COMPRESSED = True End If Band(WOFD:FileAttrib,01000h) > 0 QTFiles:FILE_ATTRIBUTE_OFFLINE = True End If Band(WOFD:FileAttrib,02000h) > 0 QTFiles:FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = True End If Band(WOFD:FileAttrib,04000h) > 0 QTFiles:FILE_ATTRIBUTE_ENCRYPTED = True End QTFiles:CreationTimeString8 = 0 QTFiles:CreationTimeReal = 0 QTFiles:CreationTimeLow = WOFD:CreateTimeLow QTFiles:CreationTimeHigh = WOFD:CreateTimeHigh IFileTime.ILowDateTime = WOFD:CreateTimeLow IFileTime.IHighDateTime = WOFD:CreateTimeHigh ReturnVal = FileTimeToSystemTime(Address(IFileTime),Address(OGSYSTEMTIME)) ReturnVal = SystemTimeToTzSpecificLocalTime(Address(TIME_ZONE_INFORMATION),Address(OGSYSTEMTIME),Address(GSYSTEMTIME)) QTFiles:CreationTimeDate = Deformat(Format(GSYSTEMTIME.GST:wYear,@N04)&Format(GSYSTEMTIME.GST:wMonth,@N02)&Format(GSYSTEMTIME.GST:wDay,@N02),@D12) QTFiles:CreationTimeTime = ((GSYSTEMTIME.GST:wHour * 60 * 60 * 100)+1) + ((GSYSTEMTIME.GST:wMinute * 60 * 100)) + ((GSYSTEMTIME.GST:wSecond * 100)) + (GST:wMilliseconds/100) QTFiles:LastAccessTimeString8 = 0 QTFiles:LastAccessTimeReal = 0 QTFiles:LastAccessTimeLow = WOFD:LastAccessTimeLow QTFiles:LastAccessTimeHigh = WOFD:LastAccessTimeHigh IFileTime.ILowDateTime = WOFD:LastAccessTimeLow IFileTime.IHighDateTime = WOFD:LastAccessTimeHigh ReturnVal = FileTimeToSystemTime(Address(IFileTime),Address(OGSYSTEMTIME)) ReturnVal = SystemTimeToTzSpecificLocalTime(Address(TIME_ZONE_INFORMATION),Address(OGSYSTEMTIME),Address(GSYSTEMTIME)) QTFiles:LastAccessTimeDate = Deformat(Format(GSYSTEMTIME.GST:wYear,@N04)&Format(GSYSTEMTIME.GST:wMonth,@N02)&Format(GSYSTEMTIME.GST:wDay,@N02),@D12) QTFiles:LastAccessTimeTime = ((GSYSTEMTIME.GST:wHour * 60 * 60 * 100)+1) + ((GSYSTEMTIME.GST:wMinute * 60 * 100)) + ((GSYSTEMTIME.GST:wSecond * 100)) + (GST:wMilliseconds/100) QTFiles:LastWriteTimeString8 = 0 QTFiles:LastWriteTimeReal = 0 QTFiles:LastWriteTimeLow = WOFD:LastWriteTimeLow QTFiles:LastWriteTimeHigh = WOFD:LastWriteTimeHigh IFileTime.ILowDateTime = WOFD:LastAccessTimeLow IFileTime.IHighDateTime = WOFD:LastAccessTimeHigh ReturnVal = FileTimeToSystemTime(Address(IFileTime),Address(OGSYSTEMTIME)) ReturnVal = SystemTimeToTzSpecificLocalTime(Address(TIME_ZONE_INFORMATION),Address(OGSYSTEMTIME),Address(GSYSTEMTIME)) QTFiles:LastWriteTimeDate = Deformat(Format(GSYSTEMTIME.GST:wYear,@N04)&Format(GSYSTEMTIME.GST:wMonth,@N02)&Format(GSYSTEMTIME.GST:wDay,@N02),@D12) QTFiles:LastWriteTimeTime = ((GSYSTEMTIME.GST:wHour * 60 * 60 * 100)+1) + ((GSYSTEMTIME.GST:wMinute * 60 * 100)) + ((GSYSTEMTIME.GST:wSecond * 100)) + (GST:wMilliseconds/100) QTFiles:FileSizeString8 = 0 QTFiles:FileSizeLow = WOFD:FileSizeLow QTFiles:FileSizeHigh = WOFD:FileSizeHigh QTFiles:FileSizeReal = (WOFD:FileSizeHigh*256) + WOFD:FileSizeLow QTFiles:DosFileName = WOFD:AlternateFileName If QTFiles:FILE_ATTRIBUTE_DIRECTORY = True QTDirs:NumberHIGH = QTDirs:NumberHIGH + 1 QTDirs:Number = QTDirs:NumberHIGH QTDirs:QTFilesNumber = QTFiles:Number QTDirs:Name = Clip(LocalCurrentPath) & Clip(QTFiles:Name) QTDirs:QTFilesPosition = Pointer(QTFiles) + 1 Add(QTDirs) TotalQTDirs = TotalQTDirs + 1 QTFiles:QTDirsNumber = QTDirs:Number Else QTFiles:QTDirsNumber = 0 End Add(QTFiles) End


Today is April 20, 2024, 1:54 am
This article has been viewed 35110 times.
Google search has resulted in 126 hits on this article since January 25, 2004.



Back to article list   Search Articles   Add Comment   Printer friendly

Login

User Name:

Password: