      

      14 

            ,   
  .    MS-DOS: ,  ,   
       16- Windows. 
   ,   /,   
 MS-DOS. (,  16- Windows    
   :     32    
 ,            
 .) 
     Windows 95  Windows NT  32-      
 .  ,      . 
       Windows 95  FAT (file allocation table,  
 );     Windows NT. FAT  
      255  .   
     Unicode,    (  ),  
      ,   .  
    FAT  ,        
3  :   ,       
  . 
    "'Windows NT    FAT,   NTFS (  NT), 
    ,  FAT,  - .    NTFS 
        .   
        .  
   : ,       
,       . NTFS   
  POSIX      (hard links), 
          
     (case-sensitive filenames). 
    NTFS    . ,    
      ,       
 (    ),    
( ),      
,       ,   
   -. ,   
    , NTFS, ,   , 
-,  ,   FAT. 
    CDFS (  CD-ROM)     
CD-ROM     ,   .    
    -     Windows 95  
Windows NT.         
   : 

    415 

    416 ____________________________Windows   

            
- ,   .     
   . 
             
 -,    . ,  
 - ,    ,     
     . 
     -        
 . 
          CD-ROM        
,      . 
        -  ,    
    ,   , 
  . 
    ,  Microsoft   CD-ROM   Windows NT  
Windows 95, ,    -  . 
     ,         
  .  Windows NT    
     FAT,     NTFS     
   ,   FAT. 

        Win32 

     Win32    ,    
   .  :    
       ,    
 FAT.         (pathname)  
   (\).     ,  
     : 
          ; 
              
(\),   ASCII-  0  31,   ,    
  ; 
             ,   
       .     
ReadMe.Txt ,      README.TXT   ; 
      (.)   . , AREADME.TXT 
,   README.TXT    ; 
       (..)   . , 
.AREADME.TXT ,   README.TXT     
 ; 
      (.),       ,  
  . ,   README.TXT   
    ; 
              
  <, >, :, "  ]. 
           , 
 Win32.   ,    
  

    _____________________________ 14.   417 

          . 
, NTFS        
, a FAT  . 

          

    ,   .      
 ,       .  
     : 

    DWORD GetLogicalDrives(void): 

       32- ,    
,     . ,  
0 ,      ,      Z,  
   25. 
    ,     -  , 
 : 

    BOOL DoesDriveExist (TCHAR cDnveLetter) { 
    cDriveLetter = (TCHAR) CharUpper(cDriveLetter): 
    return(GetLogicalDrives() & (1  (cDriveLetter - ___TEXT('A')))): 
    } 

      GetLogicalDrives       
   : 

    UINT GetNumDnvesInSys (void) { 
    DWORD dw = GetLogicalDrlvesO; 
    UINT uDnvesInSys = 0; 
    // ,       
    while (dw != 0) { 
    if (dw & 1) { 
    
    //    ,   
    uDrivesInSys++; 
    } 
    
    //    1   
    i = 1; 
    
    //     
    return(uDrivesInSys); 

    GetLogicalDrives  ,    - . 
_.    GetLogicalDriveStrings    
    : 

    DWORD GetLogicalDnveStrings(DWORD cchBuffer, LPTSTR IpszBuffer): 

      ,     IpszBuffer,  
       .  cchBuffer 
   .      
,     .      
    cchBuffer.    
 cchBuffer,   .      ,  
  . 

    418 ______________________________Windows   

            cchBuffer,  0,  
         
 .    ,      
 : 

    DWORD dw = GetLogicalDriveStrings(0, NULL); 
    LPTSTR IpDriveStrings = HeapAlloc(GetProcessHeap(), 0, dw * sizeof(TCHAR)); 
    GetLogicalDriveStrlngs(dw. IpDriveStrings); 

     ,  ,    ,    
 , . .     ,  
    .      : 

    A:\<nuU> 
    B:\<nuU> 
    C:\<null> 
    D:\<null> 
    E:\<nuU> 
    F:\<null> 
    G:\<null> 
    <null> 

    ,          
, , ,     .   
  GetDriveType: 

    UINT GetDriveType(LPTSTR IpszRootPathName); 

       ,   IpszRootPathName. 
   : 

                 

    DRIVE_UNKNOWN             . 
    DRIVE_NO_ROOT_DIR          . 
    DRIVE_REMOVABLE               ( ). 
    DRIVE_FIXED                    . 
    DRIVE_REMOTE                  . 
    DRIVE_CDROM            CD-ROM. 
    DRIVE_RAMDISK           ,    ,  RAM-. 


        

     32-, ,      
  FAT, NTFS  CDFS,   ,      
 .         
 ,  , "   ,  
 ,      .  
        
,   GetVolumeInformaUon: 

    BOOL GetVolumeInforniation(LPTSTR, IpRootPathName, 
    LPTSTR IpVolumeNameBuffer, DWORD nVolumeNameSize, 
    LPDWORD IpVolumeSerialNumber, LPDWORD IpMaximumComponentLength, 
    LPDWORD IpFileSystemFlags, LPTSTR IpFileSystemNameBuffer, 
    DWORD nFileSystemNameSize): 

    _______________________________ 14.   419 

          ,   
,   IpRootPathName.   
        DWORD,   . 
         IpVolumeNameBuffer.  
nVolumeNameSize      .   
 DWORD,     IpVolumeSerialNumber,  
   .      , 
 NULL  IpVolumeSerialNumber. ~~    
 ,   .   MS-DOS  4.0, 
 FORMAT     .  ,     
   ,    .    
   ,     ,   
  ,     . 
     IpMaximumComponentLength     DWORD,  
   ,      
.    FAT, NTFS  CDFS    255.   
            
.       !      
   ,  ',         
,      ,     
    . 
     ,    -   
-  ,    - 
 ,     ,     
    ,       .  
 ,    ,  ,   . 
     ,    ,   Unicode (  FAT  
NTFS).    Unicode,     .   
    ,     
,      ,    
  . 
       DWORD,    IpFileSystemFlags  
GetVolumeInformation,  ,    .  
 : 

                  

    FS_CASE_IS_PRESERVED                    
 . 
    FS_CASE_SENSITIVE                    
     . 
    FS_UNICODE_STORED_ON_DISK         
    Unicode. 
    FS_PERSISTENT_ACLS                   
  (access control lists, ALCs) (  NTFS). 
    FS_FILE_COMPRESSION                 
  .  NTFS    ,   FAT 
   .  ,  NTFS    
,   FAT  . 
    FS_VOL_IS_COMPRESSED               
 .  NTFS    ,   FAT   
 .  ,  NTFS    ,   FAT  . 

    420 _____________________________Windows   

     IpFileSystemNameBuffer   ,    
    (FAT, NTFS  CDFS),   
nFileSystemNameSize       . 
          (, -), 
  : 

    SetErrorMode(SEM_FAILCRITICALERRORS); 

        GetVolumeInformation      
  ,      . 
      ,   GetVolumeInformation, 
         
.        .  
 : 

    BOOL SetVolumeLabel(LPTSTR IpRootPathName, LPTSTR IpVolumeName); 

            ,  
    .    NULL,     
  .  IpVolumeName   .   
 NULL,    . 
       ,       : 

    BOOL GetDiskFreeSpace(LPTSTR IpszRootPathName, 
    LPDWORD IpSectorsPerCluster, LPDWORD IpBytesPerSector, 
    LPDWORD IpFreeClusters, LPDWORD IpClusters): 

           ,   
 IpszRootPathName.  ,      , 
   (  512  ),    
.  FAT       : 

                          

       360                 2 
       1.2                 4 
       200               8 
       400               32 

       ,    , 
 . ,   10     
360-  2 ,  1  (2  512),   200- 
   8 ,  4  (8  512). 
     ,     2   1 ,   
   200-  ,    4   
.   ,      .   
    ,   ,   
 .     ,   260- 
   ,        512 .  
  1   32 . ,    1  
  16   .       
   200 , ,       
100        !    , 
     ,     
       250 ,     
250     8  . 

    _____________________________ 14.   421 

    VwiNoows/ Microsoft     FAT32,  
FAT,  \95/   .      
  \/       MS-DOS  16- 
Windows,       . Microsoft ,  
     ,  
   . ,      
,      Win32 API. 

    \WINDOWS/ 
        Windows NT    FAT32.  
FAT32      ,       
Windows 95 (OSR 2),    Windows NT. 

      ,  GetDiskFreeSpace,    
,     : 

    DWORD dwSectorsPerCluster, dwBytesPerSector: 
    DWORD dwFreeClusters, dwClusters: 
    DWORD dwTotalDiskSpace. dwFreeDiskSpace, dwUsedDiskSpace; 
    GetDiskFreeSpace("C:\\", &dwSectorsPerCluster, 
    &dwBytesPerSector, &dwFreeClusters, &dwClusters); 
    dwTotalDiskSpace = dwSectorsPerCluster * dwBytesPerSector * dwClusters; 
    dwFreeDiskSpace = dwSectorsPerCluster * dwBytesPerSector * dwFreeClusters; 
    dwUsedDiskSpace = dwSectorsPerCluster * dwBytesPerSector * (dwClusters - uwhieeCiubtbisi. 
     Windows NT 4    GetDiskFreeSpaceBx: 
    BOOL GetDiskFree8paceEx(LPCTSTR IpDirectoryName, 
    PULARGE_INTEGER IpFreeBytesAvailableToCaller, 
    PULARGE_INTEGER IpTotalNumberOfBytes, 
    PULARGE_INTEGER IpTotalNumberOfFreeBytes): 

     ,        Windows 95,  
 GetDiskFreeSpace   ,       
    .     , 
    IpTotalNumberOfFreeBytes,   
,    .       
      . 

    - Disklnfo 

     Disklnfo (DISKINFO.EXE) (.   . 14-1)  
      .   
         DISKINFO  
-,   .       
Disk Volume Information Viewer (    ).  
         
,     . 

    422 ______________________________Windows   


    Logical drive strings: j^g^M^^e^i 
    Drive type:  Removable 
    Volume information                                , 
    Volume name:      BLANK 
    Serial number:      4105463BB4 
    Component length: 255 
    Flags:            FSCASE_IS_PRESERVED 
    FS_UNICODE_STORED_ON_DISK 
    File System:        FAT 
    Disk free space 
    Sectors/Cluster:              1 
    Bytes/Sector:            512                                               
    Free clusters:            2B47 
    Clusters:                 2B47 
    _____________________________________I                                     
                                 I 
    Drive type:   Fixed 
    Volume information 
    Volume name: 
    Serial number:      1029773316 
    Component length: 255 
    Flags:            FS_CASE_1S_PRESERVED 
    FS_UNICODE_STORED_ON_DISK 
    File System:         FAT 
    Disk free space 
    Sectors/Cluster:            16 
    Bytes/Sector:              512 
    Free clusters:            7155 
    Clusters:                63970 


    ____________________________ 14.   423 


    Drive type:  CD-ROM 
    Volume information 
    Volume name:      abba_1 
    Serial number:      1427123684 
    Component length: 221 
    Flags: 
    FS_CASE_SENSITIVE           , 
    File System:        CDFS 
    Disk free space 
    Sectors/Cluster:             1 
    Bytes/Sector:             2048 
    Free clusters:                0 
    Clusters:               231967 
    Drive type: Fixed 
    Volume information 
    Volume name: 
    Serial number:     955807662 
    Component length: 255 
    Flags:           FS CASEJS PRESERVED 
    FS^CASE SENSITIVE 
    FS_UN!CODE_STORED ON_DISK 
    FS PERSISTENT ACLS 
    F8^FILE_COMPRESSION 
    File System:       NTFS 
    Disk free space 
    Sectors/Cluster:            2 
    Bytes/Sector:            512 
    Free clusters:         102152 
    Clusters:             562432 

       ( )     
  .      
GetLogicalDriveStrings.  ^'-  ,  
   ,     .  
 Drive Type ( )   GetDriveType,    
Volume Information (  )   GetVolumeIn'formation,  
   Disk Free Space (   )   
GetDiskFreeSpace. 

    424 _____________________________ Windows   


    DISKINFO.C 
    /^,,^^,*,^...^..*,*.^,.^,^^^,^^^.**..^.^..**,,* 
    : DiskInfo.C 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    ******++*****************+****************************-lr****^***l^^t**++*^+-)-+/ 
    Sinclude ",,\CmnHdr. H"           /* .   */ 
    ftinclude <windows.h> 
    ftinclude <windowsx.h> 
    #include <tchar.h> 
    include <stdio.h>               //  sprintf 
    #include <string.h>              //  strchr 
    #include "Resource.H" 
    void Dlg_FillDriveInfo (HWND hwnd, LPTSTR IpszRootPathName) { 
    //        
    int nDriveType; 
    LPCTSTR p; 
    //       
    TCHAR szBuf[200]; 
    TCHAR lpvolumeNameBuffer[200]; 
    DWORD dwVolumeSerialNumber, dwMaximumComponentLength: 
    DWORD dwFileSystemFlags; 
    TCHAR lpFileSystemNameBuffer[50]; 
    //        
    DWORD dwSectorsPerCluster, dwBytesPerSector; 
    DWORD dwFreeClusters, dwClusters; 
    //      
    nDriveType = OetDriveType(lpszRootPathName); 
    switch (nDriveType) { 
    case DRIVE_UNKNOWN; 
    p = __TEXT("Cannot be determined."); 
    break; 
    case DRIVE_NO_ROOT_DIR: 
    p = __TEXT("Path does not exist,"); 
    break: 
    case DRIVE_REMOVABLE: 
    p = __TEXT("Removable"): 
    break; 

    . . . 


    . 14-1.   Disklnfo 


    _____________________________ 14.   425 


    . 14-1   () 

    case DRIVE_FIXEO: 
     = __("Fixed"); 
    break; 
    case DRIVE_REMOTE: 
    p = __TEXT("Remote"); 
    break; 
    case DRIVE_CDROM: 
    P = __TEXT("CD-ROM"); 
    break; 
    case DRIVE_RAMDISK; 
    P = __TEXT("RAM disk"); 
    break; 
    default: 
    P = __TEXT("Unknown"); 
    break; 
    SetWindowText(Get01gItem(nwnd, IDC_DRIVETYPE), p); 
    //     
    
    if (GetVolumeInformation(lpszRootPathName, IpVolumeNameBuffer, 
    hDIMOF(IpVolumeNameBuffer), &dwVolumeSerialNumber, 
    &dwMaximumCoinponent Length, &dwFileSystemFlags, 
    IpFileSystemNameBuffer, chDIMOF(lpFileSystemNameBuffer))) { 
    
    _stprintf(szBuf, __TEXT("%s\n%u\n%u\n"), 
    IpVolumeNameBuffer, dwVolumeSerialNumber, 
    dwMaxiinumComponentLength); 
    
    if (dwFileSystemFlags & FS_CASE_IS_PRESERVED) 
    _tcscat(szBuf, __TEXT("FS_CASE_IS_PRESERVED")); 
    _tcscat(szBuf, __TEXT("\n")): 
    if (dwFileSystemFlags & FS_CASE_SENSITIVE) 
    _tcscat(szBuf, __TEXT("FS_CASE_SENSITIVE")); 
    _tcscat(szBuf, __TEXT("\n")); 
    if (dwFileSystemFlags & FS_UNICODE_STORED_ON_DISK) 
    _tcscat(szBuf, __TEXT("FS_UNICODE_STOREO_ON_DISK")): 
    _tcscat(szBuf, __TEXT("\n")); 
    if (dwFileSystemFlags & FS_PERSISTENT_ACLS) 
    _tcscat(szBuf, __TEXT("FS_PERSISTENT_ACLS")); 
    _tcscat(szBuf. __TEXT("\n")); 

    . . . 

    426 _____________________________Windows   


    . 14-1   () 

    if (dwFileSystemFlags & FS_FILE_COMPRESSION) 
    _tcscat(szBuf, __TEXT("FS_FILE_GOMPRESSION")); 
    _tcscat(szBuf, __TEXT("\n")); 
    if (dwFileSystemFlags & FS_VOL_IS_COMPRESSED) 
    _tcscat(szBuf, __TEXT("FS_VOL_IS_COMPRESSED")); 
    _tcscat(szBuf, __TEXT("\n")); 
    _tcscat(szBuf, IpFileSystemNanieBuffer); 
    } else { 
    _tcscpy(szBuf, __TEXT("NO VOLUME INFO")); 
    s 
    SetWindowText(GetDlgItem(hwnd. IDC_VOLINPO), szBuf); 
    //      
    
    if (GetDiskFreeSpace(lpszRootPathName, &dwSectorsPerCluster, &dwBytesPerSector, 
    &dwFreeClusters, &dwClusters)) { 
    
    _stprintf(szBuf, _TEXT("%u\n%Li\n%u\n%u"), 
    dwSectorsPerCluster, dwBytesPerSector, 
    dwFreeClusters, dwClusters); 
    } else { 
    _tcscpy(szBuf, __TEXT("NO\nDISK\nSPACE\nINFO")); 
    } 
    SetWindowText(GetDlgItem(hwnd, IDC_DISKINFO), szBuf); 
    lllllllllll/IHI/llll/lillllllllllll/lll//l/l/lllllllllllllllll/lllllllll/tllll 
    
    BOOL 01g_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    DWORD dwNuniBytesForDriveStrings; 
    HANDLE hHeap; 
    LPTSTR pszAHDrives, pszDrive; 
    TCHAR szLogDnve[100]; 
    HWND  hwndCtI = GetDlgItem(hwnd, IDC^LOGDRIVES); 
    int nNumDrives = 0, nDriveNum; 
    
    //      
    chSETDLGICONS(hwnd, IDI_DISKINFO, IDI_DISKINFO); 
    //   ,      
    //    
    dwNumBytesForDriveStnngs = GetLogicalDriveStrings(0, NULL) * sizeof (TCHAR): 
    //     GetLogicalDriveStrings 
    
    //          
    hHeap = GetProcessHeapO; 

    I A(. . . 

    _____________________________ 14.   427 


    . 14-1  () 

    pszAllDrives = (LPTSTR) HeapAlloc(hHeap, 
    HEAP_ZERO_MEMORY, dwNuinBytesForDriveSt rings); 
    
    //        
    GetLogicalDriveStrings(dwNumBytesForDriveStrings / sizeof(TCHAR), pszAllDrives); 
    
    //        
    pszDrive = pszAllDrives; 
    while (pszDrive[0] != 0) { 
    ComboBox_AddString(hwndCtl, pszDrive); 
    nNumDrives++: 
    pszDrive = _tcschr(pszDrive, 0) + 1; //     
    \ 
    { 
    HeapFree(hHeap, 0, pszAllDrives); 
    
    //       ,  
    //     ,     
    for (nDriveNum = 0; nDriveNum < nNumDrives: nDriveNum++) { 
    ComboBox_GetLBText(hwndCtl, nDriveNum, szLogDrive); 
    if (GetDriveType(szLogDrive) == DRIVE_FIXED) 
    break; 
     i 
    if (nDriveNum == nNumOrives) { 
    //       ; 
    //    
    ComboBox_GetLBText(hwndCtl, nDriveNufn = 0, szLogDrive); 
    i I 
    
    //         
    //     
    ComboBox_SetCurSel(hwndCtl. nDriveNum); 
    Dlg_FillDriveInfo(nwnd, szLogDrive); 
    return(TRUE); 
    } 
    IIIIIIIIIIIIIIIIIIIIIIIIIII//IIIIII//IIII//I/I////III/IIII//IIIIIHIIIII/IIIIH 
    
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotify) { 
    TCHAR szLogDrive[100]; 
    switch (id) { 
    case IDC_LOGDRIVES: 
    
    if (codeNotify != CBN_SELGHANGE) 
    break; 

    . . . 

    428 _._-_____________________________Windows   


    . 14-1  () 

    ComboBox_GetText(hwndCtl, szLogDrive, chDIMOF(szLogDrive)); 
    Dlg_FillDriveInfo(hwnd, szLogDrive): 
    break; 
    case IDCANCEL: 
    End0ialog(hwnd, id); 
    break; 
    //////////////////////////////////////////l/////-ll////-'/'l' 
    BOOL CALLBACK Dlg_Proc (HWNO hwnd, UINT uMsg, WPARAM wParam, LPARAM IParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM^INITDIALOG, Dlg_OnInitDialog); 
    chHANDLE^DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand): 
    } 
    retur-n(FALSE); 
    ///////////////////////////////////////////
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_DISKINFO), NULL, Dlg_Proc): 
    return(O); 
    /////////////  ///////////////////


       

        ,  .   
       .   
    . 
       
       : 

    BOOL GetCurrentDirectory(DWORD ccriCurDir, LPTSTR IpszCurDir); 

           ,    
IpszCurDir.  cchCurDir      
.     0,      , 
  ,      .  
     

    _____________________________ 14.   429 

     ,     ,   
 .      GetCurrentDirectory, 
  : 

    TCHAR szCurDir[MAX_PATH]; 
    DWORD dwResult = GetCui-rentDirectory(sizeof (szCurDir) / sizeof(TCHAR), szCurDir); 
    if (dwResult == 0) { 
    //   
    } else { 
    if (dwResult < (sizeof(szCurDir) / sizeof(TCHAR))) { 
    //   
    } else { 
    //   

    ,    _?     
WINDEF.H  260.  MS-DOS      __ 
   80.       , 
   Windows 95  Windows NT.    ,   
     ,     
       : 

    char szFileName[13];       // "_" + '.' + "" + _ 

          ,  ,   
   ,      ,   
   13 . 
              
.     _,      
.  ,   Win32    MAX_FILE, 
        260. 
    ,       ;   
, ,       512 .  
      ,   
GetVolumeInformation   ,   ,   
  IpMaximumComponentLength. 

       

          : 

    BOOL SetCurrentDirectory(LPTSTR IpszCurDir); 

    SetCurrentDirectory        
,     .   ,  
SetCurrentDirectory,     ,   
   ,    SetCurrentDirectory. 

       

       ,    
 ^_: 

    UINT GetSystemDir-ectory(LPTSTR IpszSysPath. UINT cchSysPath): 


    430 ______________________________Windows   J 

         IpszSysPath   ,  
   :                                                       
    
    C:\WINDOWS\SYSTEM      (Windows 95)                                        
    C:\WINNT\SYSTEM32      (Windows NT) 

    ,  GetSystemDirectory,    
,   GetCurrentDirectory.      
 .  ,     Windows ( 
, \   ,      
Windows,   )   ,     
      .   
  ,          . 

       Windows 

          ,   
 ,     Windows.   
  : 

    UINT GetWindowsDirectory(LPTSTR IpszWinPath, UINT cchWinPath): 

        ,     IpszWinPath, 
   Windows.    - : 

    C:\WINDOWS      (Windows 95) 
    C:\WINNT        (Windows NT) 

       Windows      
    Windows.   ,  
   .      
    ,      
 Windows    . 

        


    , ,  3 ,   : 

    BOOL CreateDirectory(LPTSTR IpszPath, LPSECURITY_ATTRIBUTES Ipsa); 
    BOOL CreateDirectoryEx(LPCTSTR IpTemplateDirectory, LPCTSTR IpNewDirectory, 
    LPSECURITY_ATTRIBUTES IpSecuntyAttributes); 
    BOOL RemoveDirectory(LPTSTR IpszDir-); 

     ,     ,     
 .       
 SECURITY_ATTRIBUTES     , , 
,           
.          
NTFS.  CreateDirectory  CreateDirectoryEx   , 
 bInheritHandle  SECURITY_ATTRIBUTES . 
    CreateDirectoryEx     ,  
 -   (, ,    
  ).          
        3   TRUE,       | 
FALSE. RemoveDirectory  ,     (. .  
-      )         
 .              

    _____________________________  14.   431 


    , ,     

     16- Windows  MS-DOS       
     .    : 
 -,  -,  ,  , 
  -       -. 
  ,     .      
     ,     
 .  , ,     . 

     

     Win32       : 

    BOOL CopyFile(LPTSTR IpszExistingFiie, LPTSTR IpszNewFile, 
    BOOL fFailIfExists); 

    CopyFile  ,    IpszExistingFiie,   
,       IpszNewFile.  
fFailIfExists :      ,    
    ,   IpszNewFile.     
    fFailIfExists  TRUE,    
.          .  
  CopyFile  TRUE.    
 ,     .    , 
    -   .  Windows NT 4 
   CopyFileEx: 

    BOOL CopyFileEx(LPCWSTR IpExistingFileName, LPCWSTR IpNewFileName, 
    LPPROGRESS_ROUTINE IpProgressRoutine, LPVOID IpOata, 
    LPBOOL pbCancel, DWORD dwCopyFlags); 

            . 
         CopyFile. 
  IpProgressRoutine    NULL (     
   )     , 
    . (      
.)  IpData  32- ,    
,  pbCancel      BOOL,   
 CopyFileEx.      CopyFileEx 
 .    ,   
 CopyFileEx  bCancel  TRUE.     
, bCancel  FALSE.  dwCopyFlags    
  : 

                          

    COPY_FILE_FAIL_IF_EXISTS   CopyFileEx   , 
   ,    IpNewFileName,  . 
    COPY_FILE_RESTARTABLE    CopyFileEx    
  .   ,    
  CopyFileEx     ,   . 

    432 _____________________________Windows   

      ,     ,   : 

    DWORD WINAPI CopyProgressRoutine( 
    LARGE_INTEGER TotalFileSize, LARGEJNTEGER TotalBytesTransferred, 
    LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, 
    DWORD dwStreamNumber, DWORD dwCallbackReason, 
    HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID IpData) { 
    } 

            ,  
  .   ,     
  . ,      . 
( ,    Win32 API     .)  
  ,        . 
   CopyProgressRoutine   ,  
   (dwStreamN umber),    (StreamSize)   
   (StreamBytesTransferred).      
 1. 
     dwCallbackReason       
.     : 

                             

    CALLBACK_STREAM_SWITCH          . 
    CALLBACK_CHUNK_FINISHED          . 

         -  
-,   32- ,    
CopyFileEx. CopyProgressRoutine     : 

           

    PROGRESS_CONTINUE       . 
    PROGRESS_CANCEL            -. 
    PROGRESS_STOP             ,    
-.     .  
  ,   CopyFileEx    COPY_FILE_RESTARTABLE. 
    PROGRESS_QUIET           ,  CopyProgressRoutine 
  . 

     

       ,  : 

    BOOL DeleteFile(LPTSTR IpszFileName): 

     ,    IpszFikName,   TRUE  
     ,      
  . 
  . 


    _____________________________ 14.   433 


    VWINDOWS/ 
     Windows 95  DeleteFile       Windows NT j 
 .         
.           DeleteFile. 


     

       2 : 

    BOOL MoveFile(LPTSTR IpszExisting. LPTSTR IpszNew); 

     

    BOOL MoveFileEx(LPTSTR IpszExisting, LPTSTR IpszNew. DWORD fdwFlags); 

        (   IpszExisting)  
  (   IpszNew ).     
  . ,      CLOCK.EXE 
  WINNT         : 
    MoveFile("C:\\WINNT\\CLOCK.EXE", "C;\\"); 

       : 

    MoveFile(":\\WINNT\\CLOCK.", ":\\CLOCK.EXE"); 

               
  .       
  ,  Movefile  MoveFileEx     
,   .         
    .     
    ,       
.         .  
           
,    .         
     ,       . 
          TRUE.    
,   -          
 ,   IpszNew. 
            ,   
  . ,     UTILITY  
TOOLS,  : 

    MoveFile(":\\UTILITY", ":\\TOOLS"); 

    ,   ,   Movefile  MoveFileEx   
  ,        . 
 "         , 
  FindFirstFile, FindFirstFileEx, FindNextFile  FindClose 
(     )      .    
    CreateDirectory     
   .     MoveFile    
  ,     RemoveDirectory,    
 . 

    434 _____________________________Windows   


      MoveFf/e  MoveFf/eEx 

       fdwFlags,  MoveFileEx  
       ,  Movefile. 

    VWINDOWS/ 
     Windows 95  MoveFileEx   FALSE.   
GetLastError   ERROR_CALL_NOT_IMPLEMENTED. 

     MoveFileEx ,      
- ,       .    
           ,   
 MoveFileEx  MOVEFILE_REPLACE_EXISTING.    
   . 
      MoveFileEx       .  
   ,   MOVEFILE_COPY_ALLOWED.  Windows 
NT  Movefile   MoveFileEx     ,  , 
 Movefile  MoveFileEx,     .   
 ,       . 
       MOVEFILE_DELAY_UNTIL_REBOOT,      
    ,   .    
    ,     . 
         
   .       
     . 
     MOVEFILE_DELAY_UNTIL_REBOOT    . 
,       .    
       ,    - 
 .     Setup      
     . , Setup  MoveFileEx, 
   IpszExisting     ,    
IpszNew  ,     .  ,   
 MOVEFILE_DELAY_UNTIL_REBOOT.  ,      
  ,   Setup.     
       . 
     MOVEFILE_WRITE_THROUGH    Windows NT 4.  
  , MoveFileEx   ,     
.   ,  MoveFileEx       
  .  MOVEFILE_WRITE_THROUGH ,  
   MOVEFILE_DELAY_UNTIL_REBOOT. 
      MoveFileEx  Movefile  ,     
  .   MoveFileEx   ,  
 "NULL   IpszNew.  ,     ,  
    (IpszExisting)  ,    
 . 

     

     RenameFik  Win32 .     
Movefile  MoveFileEx.       ,  
  .   CLOCK.EXE  WATCH.EXE,  : 

    MoveFile(":\\WINNT\\GLOGK.EXE", ":\\WINNT\\WATCH.EXE"); 


    _____________________________ 14.   435 

                  , 
    CLOCK.EXE    WINNT   
     WATCH.EXE. ,  . 
            
    ,   MoveFileEx -  
 MOVEFILE_DELAY_UNTIL_REBOOT.    ,    
   ,      
,   . 
              , 
   .       
  : 

    DeleteFile("*.BAK"); 

         -   ?    
      -   ,  
 DeleteFik    .     
  FindFirstFile, FindFirstFileEx, FindNextFile  FindClose. 

      

        .     
         (, 
Microsoft Excel   Lotus 1-2-3),       
   ,  Microsoft    
 ,     .    
   File Open  File Save As .    
      ,       . 
            (    
  )   .  16- Windows  
   OpenFile   OF_PARSE.  Win32  
  : 

    DWORD GetFullPathName(LPCTSTR IpszFile, DWORD cchPath, 
    LPTSTR IpszPath. LPTSTR *ppszFilePart); 

        (    )  
 IpszFile. ,         
,         ,   
  IpszPath.       
 cchPath.  ppszFilePart     LPTSTR;  
         IpszPath,  
     (  ).  
   ,    . 
    ,     Wordpad      HIMOM.TXT,  
  : 

    HIMOM.TXT - Wordpad 

     ppszFilePart    .     
   : 

    szFilePath = strrchr(szPath, '\\') + 1; 

    GetFullPathName           
      (  ).      
 . 
             - , 
  : 

    436 ______________________________Windows   

    DWORD SearchPath(LPCTSTR IpszPath, LPCTSTR IpszFile, 
    LPCSTR IpszExtension, DWORD cchReturnBuffer, 
    LPTSTR IpszReturnBuffer, LPTSTR *plpszFilePart): 

           .    
 IpszPath.    NULL,      
"    : 

    1. ,     .                         
    2.  .                                                        
    3.   Windows. 
    4.   Windows. 
    5. ,     PATH. 

        IpszFile.   ,   
 ,   ,   IpszExtension   
NULL;        IpszExtension,  
     .     , 
    .    3     ,   
 3   GetFullPathName.   ; 
            .  
     ,   ,  
 FindFirstFile: 

    HANDLE FindFirstFile(LPTSTR IpszSearchFile, LPWIN32_FIND_DATA Ipffd); 

      ,      .  
IpszSearchFile    (    ),  
 .       (*  ?)   . 
 Ipffd   LPWIN32_FIND_DATA: 

    typedef struct _WIN32_FIND_DATA { 
    DWORD dwFileAttributes; 
    FILETIME ftCreationTime; 
    FILETIME ftLastAccessTime; 
    FILETIME ftLastWnteTime; 
    DWORD nFileSizeHigh; 
    DWORD nFileSizeLow; 
    DWORD dwReservedO; 
    DWORD dwReservedl; 
    CHAR cFileName[ MAX_PATH ]; 
    CHAR cAlternateFileName[ 14 ]; 
    } WIN32_FIND_DATA, * PWIN32_FIND_DATA, *LPWIN32_FIND_DATA; 

     ,       
 ,       
,         INVALID_HANDLE_VALUE 
   -   I  .                                      
                        ; 
     FindFirstFile     INVALID_HANDLE_VALUE,  
 NULL. 

    ^ \ 
     WIN32_FIND_DATA     : , 
   .  cFileName    .  
  .   cAlternateFileName    
 . 

    _____________________________ 14.   437 

    ,    ,   16- Windows. 
   File Open,       . 
    ,       NTFS,   
        50 ? 
     OS/2 ,       , 
  HPFS,    .   Win32 Microsoft  ( 
!),       .   
  16- Windows      , 
     8.3. ,   
 ()     cAlternateFileName  WIN32_FIND_DATA. 
           cFileName  
cAlternateFileName, , .      cFikName 
  ,    cAlternateFileName  . 
,       Hello Mom and Dad  
 HELLOM-1. 
      : 

    DWORD GetShortPathName(LPCTSTR IpszLongPath, LPTSTR IpszShortPath, 
p^QRp cchBuffer); 
    
    /\ 
      IpszLongPath     ,   
 ,         ,  
   IpszShortPath.       
   cchBuffer.    , 
   . 

     FindFirstPile   ,    FindNextFile 
   ,  ,   
 FindFirstFile: 

    BOOL FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA Ipffd): 

        ,    
FindFirstFile.       WIN32_FIND_DATA.  
     ,   ,      FindFirstFile. 
       FindNextFile  TRUE    
WIN32_FIND_DATA;      FALSE. 

    VWINDOWS/ 
     Windows 95  FindFirstFile  FindNextFile   . 
      ?   
,       . ,   
 FindFirstFile  FIL??.???,  FILEA.TXT  ,  
 FILE.TXT  .  Windows NT   ,     . 
     ,  ,  FindFirstFile, : 

    BOOL FindClose(HANDLE hFindFile); 

    /\ 
        (   Win32) ,    
 CloseHandle  .    FindClose   
  -  ,   . 
    FindFirstFile  FindNextFile      ( 
),    ,   .   
   ,     . 

    438 ______________________________Windows   

     Windows NT 4    FindFirstFileEx: 

    HANDLE FindFirstFileEx(LPCTSTR IpFileName, 
    FINDEX_INFO_LEVELS finfolevelld, LPVOID IpFindFileData. 
    FINDEX_SEARCH_OPS fSearchOp, LPVOID IpSearchFilter, 
    DWORD dwAdditionalFlags); 

           Windows NT 4,   
  .   IpFileName     
 (    )   
   .  flnfobevelld    
      ( Windows NT 4    
 FindExInfoStandard).  IpFindFileData     
,        .  
 flnfoLevelId    .   flnfoLevelld 
  FindExInfoStandard,  IpFindFileData    
 WIN32_FIND_DATA. 
       fSearchOp  IpSearchFilter  
FindFirstFileEx  FindFirstFile.      
 .     fSearchOp    
 : 

                            

    FindExSearchNameMatch            ,  
  IpFileName. 
    FindExSearchLimitToDirectories         
. (     .) 
    FindExSearchLimitToDevices            . 

      fSearchOp       
  .       
      ,  
  IpSearchFilter   NULL.  ,  
   ,    FindFirstFileEx 
 ,     ,  
    .  IpSearchFilter    
,       ANSI-  Unicode-. 
     , dwAdditionalFlags,   
 .       
FIND_FIRST_EX_CASE_SENSITIVE.    \^32-   
  ,    .      
,      .    Windows 
NT   ,   ,    
POSIX,       , : 
ReadMe.txt, README.TXT  readme.txt. Win32-poee    
   ,     .  ,  
FIND_FIRST_EX_CASE_SENSITIVE       
 . 
    FindFirstFileEx,   FindFirstFile,  ,   
     FindNextFile  FindClose. 

    /\ 
        (   Win32) ,    
 CloseHandle  .    FindClose   
  -  ,   . 

    _____________________________ 14.   439 


    - DirWalk 

     DirWalk (DIRWALK. EXE) (.   . 14-2)  
  FindFirstFile, FindNextFile, FindClose, GetCurrentDirectory 
 SetCurrentDirectory        . 
           
DIRWALK  -,   .     
         ,   
  .      Directory Walker 
 : 
    
    IO.SYS 
    BOOTLOG.TXT 
    AUTOEXEC.DOS 
    IO.DOS 
    MSDOS.DOS 
    SUHDLOG.BAK 
    COMMAND.COM 
    BOOTSECT.DOS 
    COMMAND.DOS 
    D011V200.SYS 
    MSDOS 
    SETUPLOG.OLD 
    SUHDLOG.DAT 
    SUHDLOG 
    DETLOG.TXT 
      .  
    BOOT.INI 
    AUTOEXEC.BAT 
    CONFIG.DOS 
    DRVSPACE.BIN 
    SETUPLOG.TXT 

       WM_INITDIALOG,    - 
    DirWalk       DIRWALK.C: 

    void DirWalk(HWND hwndTreeLB, LPCTSTR pszRootPath); 

     hwndTreeLB    ,    
,  pszRootPath   .    
 \\,      . , 
,     . 
      DirWalk   ,     
 DirWalkRecurse.        
      .    
 DirWalk        
        pszRootPath. 
        DirWalkRecurse, ,     
 ,  FindFirstFile,       
 .   ,    ,   
 FindNextFile,       .  
  , DirWalkRecurse   fRecurse  
DIRWALKDATA,  ,    .    
    TRUE.    fRecurse ,  
     FILECHNG.EXE,    . 

    440 _____________________________Windows   

        DirWalkRecurse  FindFirstChildDir.  
 ,   DIRWALK.C,     
FindFirstFile.       .  
  FindNextChildDir     
FindNextFile,    . 
    DirWalkRecurse      ,   
    , ,  : 

    SetCurrentDirectory(__TEXT("..")): 

           . 
        DirWalk     
 DW  DIRWALKDATA,   ,  
 DirWalkRecurse. 
      ,        
   DirWalkRecurse.       
    .    ,    
      .   
       .  
  DIRWALKDATA  .  ,  
,     ,        . 
, , ,   DirWalk  DirWalkRecurse   
   .  2    
  ,        
,     .    
   . 
             , 
 _declspec (thread)     .   
        ,  
 . ,     ,    
   ,      ,    
  DirWalk  DirWalkRecurse. 
     ,     ?   
   TLS-.   DirWalk     
    DIRWALKDATA        
TIsSetValue.         
,   DirWalk,    ,    
,       DirWalk.   
 DirWalk   . 
       ,  - :    . 
           
.        .    
,       ,    
       . 
-,      . 
       , ,  DirWalk  DirWalkRecurse 
->    .  , ? - 
SetCurrentDirectory.       , 
   .      .  
    .   DirWalk  DirWalkRecurse  
 ,     SetCurrentDirectory.  
 ,          
FindFirstDir  ,         
.    ,  ,   
 GetCurrentDirectory  SetCurrentDirectory,     
     ! 

    _____________________________ 14.   441 


    DIRWALK.C 
    //********************************* 
    : DirWalk.C 
    :   (Jim Harkins)    (Jeffrey Richter) 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    *.*...*.*.,.*......*.....**..,,,****.**.......,**....,,*..,.,...*..**....*.**,/ 
    (tinclude "..\CmnHdr.H"           /* .   / 
    ftinclude <windows,h> 
    ftinclude <windowsx.h> 
    ftinclude <tchar.h> 
    ftinclude <stdliP.h> 
    ftinclude <stdio.h>               //  sprintf 
    ftinclude Otring. h> 
    Sinclude "Resource.H" 
    ll/lllll/llll/lllllllllllll/lllll/lllll/llilll/llllllllllllllllllllllll/lilllll 
    static BOOL IsChildDir (WIN32_FIND_DATA *lpFindData) { 
    return(((lpFindData->dwFileAttributes & FILE_ATTRIBUTE_OIRECTORY) != 0) && 
    (lstrcmp(lpFindData->cFileName, __TEXT(".")) !=0)&& 
    (lstrcmp(lpFindData->cFileName, __TEXT(", .")) !=0)); 
    t 
    f 
    llillllllllllltlllllllll/lll/lllllll////lll/l/ll/H//lll/llfl//llllllllllll//l/ 
    static BOOL FindNextChildDir (HANDLE tiFindFile, 
    WIN32_FIND_DATA *lpFindData) { 
    BOOL fFound = FALSE; 
    do { 
    fFound = FindNextFile(riFindFile, IpFindData); 
    } while (fFound && !IsChildDir(lpFindData)); 
    return(fFound); 
    } 
    IIIIIIIIIIH/llll/l//l/l/llll///llllllllll//l/ltlll/lllll/l/llllllllllillllllll 
    static HANDLE FindFirstChildDir (LPTSTR szPath, 
    WIN32_FIND_DATA *lpFindData) { 
    BOOL fFound; 
    HANDLE hFindFile = FindFirstFile(szPath, IpFindData); 
    if (hFindFile != INVALID_HANDLE_VALUE) { 
    fFound = IsChildDir(lpFindData); 

    . . . 

    . 14-2.   DirWalk 

    442 _____________________________Windows   


    . 14-2   () 

    if (ifFound) 
    fFound = FindNextChildDir(hFindFile, IpFindData); 
    if (!fFound) { 
    FindClose(hFindFile); 
    hFindFile = INVALID_HANDLE_VALUE; 
    I j 
    return(hFindFile): 
    i 
    IIIHIIIII/lllllllllllillllllllllllllllllllllllllllllll/llllllllllll/llllllllll 
    
    II      , 
    //      DIRWALKDATA   
    // ,       DirWalkRecurse 
    
    // ,  DirWalkRecurse 
    typedef struct { 
    HWND  hwndTreeLB;         //      
    int   nDepth;             //   
    BOOL  fRecurse;           //   TRUE    
    TCHAR szBuf[1000],        //     
    int   nindent;            //      
    BOOL  f0k;                //    
    BOOL  fIsDir;             //    
    WIN32_FIND_DATA FindData; //    
    } DIRWALKDATA, *LPDIRWALKDATA; 
    ../,//,//////////////////////////////////////////////.////////////////////////////// 
    
    //         
    // .   pDW->fRecurse,     
    //  -     DirWalkRecurse. 
    static void DirWalkRecurse (LPDIRWALKDATA pDW) { 
    HANDLE hFind; 
    pDW->nDepth++; 
    pDW->n!ndent = 3 * pDW->nDepth; 
    _stprintr(pDW->szBur. __TEXT("%*s"), pDW->n!ndent, __TEXT("")): 
    GetCurrentDirectory(chDIMOF(pDW->szBuf) - pDW->n!ndent, 
    &pDW->szBuf[pDW->nIndent]); 
    ListBox_AddString(pDW->hwndTreeLB, pDW->szBuf); 
    hFind = FindFirstFile(__TEXT("*,*"), &pDW->FindData); 
    pDW->fOk = (hFind != INVALID_HANDLE_VALUE); 
    * 

    . . . 

    _____________________________ 14.   443 


    . 14-2   () 

    while (pDW->fOk) { 
    pOW->fIsDir = pDW->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; 
    if (!pDW->f!sDir !; (!pDW->fRecurse && IsChildDir(&pDW->FindData))) { 
    ^stprintf(pDW->szBuf, 
    pDW->fIs01r ? __TEXT("%*s[%s]") : __TEXT("%*s%s"), 
    pDW->nIndent, __TEXT(""), pDW->FindData.cFileName); 
    ListBpx_AddString(pDW->hwndTreeLB, pDW->szBuf); 
    } 
    pDW->fOk = FindNextFile(hFind, &pDW->FindData); 
    } 
    if (hFind != INVALID_HANDLE_VALUE) 
    FindClose(hFind); 
    if (pDW->fRecurse) { 
    //     
    hFind = FindFirstChildDir(__TEXT("*.*"), &pOW->FindData); 
    pDW->fOk = (hFind != INVALID_HANDLE_VALUE); 
    while (pDW->fOk) { 
    //     
    if (SetCurrentDirectory(pDW->FindData.cFileName)) { 
    
    //     . 
    // ,     pDW 
    //    . 
    DirWalkRecurse(pDW); 
    
    //       
    SetCurrentDirectory(__TEXT("..")); 
    } 
    pDW->fOk = FindNextChildDir(hFind, &pDW->FindData); 
    } 
    if (hFind != INVALID_HANDLE_VALUE) 
    FindClose(hFind); 
    } 
    pDW->nDepth; 
    } 
    /////////////////////////////////////////////////////////////////////7////////7 
    
    //         
    // .     DirWalkRecurse,  
    //    . 
    void DirWalk ( 
    HWND hwndTreeLB,    //    

    . . . 

    444 _____________________________ Windows   

    . 14-2   () 


    LPCTSTR pszRootPath,   //     
    BOOL fRecurse) {       //   ,  TRUE 
    TCHAR szCurrDir[_MAX_OIR]; 
    DIRWALKDATA OW; 
    //    
    ListBox_ResetContent(hwndTreeLB); 
    //       
    GetCurrentDirectory(chDIMOP(szCurrDir), szCurrDir); 
    
    //    , 
    //       
    SetCurrentOirecto(pszRootPath); 
    
    // nDepth         
    // .  -1      
    //    . 
    OW. nDepth = -1; 
    DW.hwndTreeLB = hwndTreeLB; 
    DW.fRecurse = fRecurse; 
    //        
    DlrWalkRecurse(&DW); 
    
    //    ,     
    //    
    SetCu rent Directory(szCurrDir); 
    } 
    .///////////////.////////////////////////////////////V/////////////,'/"///////////' 
    BOOL Dlg_OnInitDialog (HWND hwnd, HWNO nwndFocus, LPARAM IParam) { 
    RECT re; 
    
    //      
    chSETDLGICONS(hwnd, IDI_DIRWALK, IDI_DIRWALK): 
    DirWalk(GetDlgItem(hwnd, IDC_TREE), __TEXT("\\"), TRUE); 
    GetClientRect(hwnd, &rc); 
    
    SetWindowPos(GetDlgItem(hwnd, IDC_TREE), NULL, 
    0, 0, re. right, re.bottom, SWP_NOZORDER); 
    return(TRUE): 
    } 

    I'M. . . 

    _____________________________ 14.   445 


    . 14-2  () 
    llllllllllllllllllllllllll/11111111/lllllllllllillll/llllllllllllllllllltllllll 
    void Dlg_OnSize (HWND hwnd, UINT state, int ex, int cy) { 
    SetWindowPos(QetDlgItem(hwnd, IDC_TREE), NULL, 0. 0, ex. cy, SWP_NOZOROER); 
    \ 
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl. UINT codeNotify) { 
    switch (id) { 
    case IOCANCEL: 
    EndDialog(hwnd, id); 
    break; 
    case IDOK: 
    
    //     ""   
    DirWalk(GetDlgItem(hwnd, IDC_TREE). __TEXT("\\"), TRUE); 
    break; 
    \ 
    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPAHAM 
iParam) { 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM_INITDIALOG,  Dlg_OnInitDialog); 
    chHANDLE_DLGMSG(hwnd, WM_SIZE,         Dlg_OnSize); 
    chHANDLE_DLGMSG(hwnd, WM_COMMAND,      Dlg_OnCommand); 
    return(FALSE); 
    i, 
    ////////////////      , / ,   !  ;  ,,'/     ,  ' '       ,   :   :   
    int WINAPI _tWlnMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLlne, int nCrndShow) { 
    ChWARNIFUNICODEUNDERWIN95(); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_OIRWALK), NULL, Dlg_Proc); 
    return(O); 


    446 ______________________________Windows   


          

      ,     ,   
 . ,    ,    
 Open (  Explorer)       
   .     ,  
.   ,     File 
Open,    File  Open.      
    ,      . 
   ,       
   . 
         16- Windows, ,  ,   
     FileCDR;      
      .   FileCDR  
  : ,   , -,  
       .   
  FileCDR,    . 
            
   ,   Windows 95   Windows NT   
 .     .    
,      ,    
FindFirstChangeNotification: 

    HANDLE FindFirstChangeNotification(LPTSTR IpszPath, 
    BOOL fWatchSubTree, DWORD fdwFilter): 

          .   
   ,    .  ,   
       .   
  ,    ,    
 FindFirstChangeNotification        . 
     fWatchSubTree  ,      
,    IpszPath.    FALSE,  
   ,     . 
             
  ,    OR: 

                                   

    FILE_NOTIFY_CHANGE_FILE_NAME     ,    . 
    FILE_NOTIFY_CHANGE_DIR_NAME      ,    . 
    FILE_NOTIFY_CHANGE_ATTRIBUTES       . 
    FILE_NOTIFY_CHANGE_SIZE              . 
    FILE_NOTIFY_CHANGE_CREATION         . 
    FILE_NOTIFY_CHANGE_LAST_WRITE         . 
    FILE_NOTIFY_CHANGE_LAST_ACCESS         . 
    FILE_NOTIFY_CHANGE_SECURITY          (security 
descriptor)   . 

       ,   . , 
   ,        . 
  

    _____________________________ 14.   447 

            
  ,      . 
       FindFirstChangeNotification  , 
         
,  WaitForSingleObject  WaitForMultipleObjects.    
 FindFirstChangeNotification  ^^,'  
' ),   INVALID_HANDLE_VALUE. 

    ^ \ 
      FindFirstFile,  FindFirstChangeNotification   
   INVALID_HANDLE_VALUE,   NULL. 

      ,        
FindFirstChangeNotification,  -  CreateFileChangeNotification, 
         ,    
        . 
      .-.      
 WaitForSingleObject  WaitForMultipleObjects.    
   ,      , 
 ,    FindFirstChangeNotification. 
        ,   
  :     - 
   .    WaitForSingleObject  
WaitForMultipleObjects  ,      
 ,   IpszPath,       . 
             . 
,    : 

    deltree .    (Windows 95) 
    rmdir . /s   (Windows NT) 

            ,   
     ,    
 -   ,     
.         , 
    . 
    ,          
,       . ,  
 : 

    BOOL FindNextChangeNotification(HANDLE hChange); 

       -      
 ResetEvent.      -    
 .          
  ,       . 
 FindNextChangeNotification  ,     
, ,      -   
      ,    
  ,  . 
     ,     ,    , 
   ,       
.    FindNextChangeNotification   
  -   .    
    . 

    448 _____________________________Windows   

     ,        , 
 - : 

    BOOL FindCloseChangeNotification(HANDLE hChange); 


    /\ 
        (   Win32) ,    
 CloseHandle  .    
FindCloseChangeNotification,     ,    
          . 

       ,   ,  FindFirstChangeNotification 
     .  ,     
 ,       .    
,    Windows NT 4  : 

    BOOL ReadDirectoryChangesW(HANDLE hDirectory, 
    LPVOID IpBuffer, DWORD nBufferLength, 
    BOOL bWatchSubtree, DWORD dwNotifyFilter, 
    LPDWORD IpBytesReturned, LPOVERLAPPED IpOverlapped, 
    LPOVERLAPPED_COMPLETION_ROUTINE IpCompletlonRoutine); 

           W,     
Unicode-, . .      Unicode. 
     ;      
CreateFile (   .  15): 

    HANDLE hdir = CreateFile( 
    "C:\\Program Files",                //    
    FILE_LIST_DIRECTORY,                //  (ReadDirectoryChangesW 
    //  FILE_LIST_DIRECTORY) 
    FILE_SHARE_READ ; FILE_SHARE_DELETE,//    
    NULL,                               //   
    OPEN_EXISTING,                      //   
    FILE_FLAG_BACKUP_SEMANTICS          //  
    // (   BACKL)P_SEMANTICS) 
    NULL);                               //    
    //    
        ,  : 
    CloseHandle(hdir); 
     IpBuffer  nBufferLength     ( ) 
 ,    FILE_NOTIFY_INFORMATION: 
    typedef struct _FILE_NOTIFY_INFORMATION { 
    DWORD NextEntryOffset; 
    DWORD Action; 
    DWORD FileNameLength; 
    WCHAR FileName[1]; 
    } FILE_NOTIFY_INFORMATION; 

     -     ReadDirectoryChangesW 
   ,    .  
    ,  NextEntryOffset   
,   .        
,    .  NextEntryOffset  0, 
,    .  Action ,    
  .   : 

    _____________________________ 14.   449 


      Action                
    
    FILE_ACTION_ADDED                     . 
    FILE_ACTION_REMOVED                   . 
    FILE_ACTION_MODIFIED                  (,  
   ). 
    FILE_ACTION_RENAMED_OLD_NAME      ,     . 
    FILE_ACTION_RENAMED_NEW_NAME     ,     . 

     FileNameLength      
.     , ,      
,    FileNameLength  sizeof(WCHAR), . .  2. 
 ,          . 
 FileName     .     
   Unicode     . 
      bWatchSubtree  ,    
  .   dwNotifyFilter    
  .         
  FILE_NOTIFY_*,    FindFirstChangeNotification. 
           CreateFile (  
),  ReadDirectoryChangesW     .  
,     ,       
.   "]? 'ed'dDTrectoryChanges W  
IpBytesReturned     DWORD,    
,    (    IpBuffer). 
     ReadDirectoryChangesW      ; 
      ,     
    .   ,   
       (    ).   
( ReadDirectoryChangesW   )    
 ,  CreateFile   FILE_FLAG_OVERLAPPED: 

    HANDLE hdir = CreateFile( 
    "C:\\Program Files",                 //    
    FILE_LIST_DIRECTORY,                //  (ReadDirectoryChangesW 
    //  FILE_LIST_DIRECTORY) 
    FILE_SHARE_READ : FILE_SHARE_DELETE, //    
    NULL,                                //   
    OPEN_EXISTING,                      //   
    FILE_FLAG_BACKUP_SEMANTICS ;        //  
    FILE_FLAG_OVERLAPPED             // (   BACKUP_SEMANTICS, 
    //     - OVERLAPPED) 
    NULL);                               //    
    //    

     ReadDirectoryChangesW     . 
           ,    
 : 
         OVERLAPPED     hEvent 
   .       
ReadDirectoryChangesW   IpOverlapped.  -   
 WaitForSingleObject  -   .  

    450 ____________________________Windows   

             
 . 
          (overlapped) 
/  ReadDirectoryChangesW   IpCompletionRoutine.  
      -   
,  ReadDirectoryChangesW.    , 
    (   : WaitForSingleObjectEx, 
WaitForMultipleObjectsEx, SleepEx  . .)   . 
           / (I/O 
completion port) ,  GetQueuedCompktionStatus,    
 . 

    - FileChng 

     FileChng (FILECHNG.EXE) (.   . 14-3)  
          
-.         
   FILECHNG  -,   .  
      File Change Notifications 
(   ): 

    Filters 
    " Filename      Attributes     f Lastwrite time      " Creation time 
    - Dirname      " Size          I" Last access time   ~ Security 
    " Include subdirectories                                           |      
    File list                                            Notification count    0 

             , 
  ,      .    
   Filters ().  Start   
       
FindFirstChangeNotification,        
 .  ,   Notifications Counts ( 
 ),       (  
);         . 
            
.      - ,  
  , -    
,   FileChng  ,   
Notifications Counts,     .   
   FindNextChangeNotification   

    ____________________________ 14.   451 

    ,   -.   
   Stop      . 
       ,    ,       
    WinMain,     ,   
   -.     FileChng , 
       .      
-  ,         
 -     .  
 ,     MsgWaitForMultipleObjects. 
        ,   .   
WaitForMultipleObjects  ^     .    
  MsgWaitForMultipleObjects ,      
      ,     
    GetMessage,      
 -.       
 ,    CreateDialog  DialogBox 
    .       
 . 
         ,   .    
CreateDialog,        
  .       
,       fQuit,  
 ,    .    
 fQuit   FALSE,     TRUE,   
   WM_QUIT. 
        ,  ,   
     ,    
   f\Vait4FileChanges.   , 
      Start.    : 

    dwResult = MsgWaitForMultipleObjects( 
    (fWait4FileChanges) ? 1 : 0, &s_hChange, FALSE, INFINITE, QS_ALLEVENTS); 

      - ,    
,          , 
       .    
,    . 
        ,     
.    -  ,   
Notification Count,      
FindNextChangeNotification.         
 MsgWaitForMultipleObjects. 
        -   ,  
    PeekMessage   PM_REMOVE.  
   IsDialogMessage.     
        
   .        
,     WM_QUIT.    
  fQuit   TRUE,      
    . 
         TranslateMessage,     
DispatchMessage,       . 
      ,       PeekMessage. ?  
,         
 ,         . 

    452 _____________________________Windows   


    FILECHNG.C 
    : FileChng.C 
    :   (Jim Harkins)    (Jeffrey Richter) 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    ftinclude "..\CmnHdr.H"           /* .   */ 
    #include <windows,h> 
    #include <windowsx.h> 
    #include <tchar.h> 
    #include <stdio.h> 
    Sinclude <stdlib.h> 
    ftinclude <string,h> 
    ^include "Resource.H" 
    lllll/H////////////i///ll/llll/////l///l////il//ili///////lll/lllill/llll/llll 
    //       DirWalk.C 
    static BOOL IsChildDir (WIN32_FIND_OATA *lpFindData) { 
    return(((lpFindData->dwFileAttnbutes & FILE_ATTRIBUTE_OIRECTORY) != 0) && 
    (lstrcmp(lpFindOata->cFileName, __TEXT(".")) != 0) && 
    (lstrcmp(lpFindData->cFileName, __TEXT(", .")) !=0)); 
    1 
    /////////////////////////////////////////////////////////////////////////////// 
    static BOOL FindNextChildDir (HANDLE hFindFile, WIN32_FIND_DATA 
*lpFindData) { 
    BOOL fFound = FALSE; 
    do { 
    fFound = FindNextFile(hFindFile, IpFindData); 
    } while (fFound && !IsChildOir(IpFindData)); 
    return(fFound); 
    } 
    ///lill/llllllll/l/^/l/ll/lllil/l/l/lllil/l/l//l/l//l/^l/lllll//lll//ilil//l/// 
    static HANDLE FindFirstChildDir (LPTSTR szPath, WIN32_FIND_DATA 
*lpFindData) { 
    BOOL fFound; 
    HANDLE hFindFile = FindFirstFile(szPath, IpFindData); 
    if (hFindFile != INVALID_HANDLE_VALUE) { 
    fFound = IsChildDir(lpFindData); 
    if (!fFound) 
    fFound = FindNextChildDir(hFindFile, IpFindData); 
    LM. LAi'i). Llllp. 

    . 14-3.   FileChng 

    ____________________________ 14.   453 


    . 14-3   () 

    if QfFound) { 
    FindClose(hFindFile); 
    hFindFile = INVALID_HANDLE_VALUE; 
    } return(hFindFile); 
    f 
    111111111111111111111111111111111111111/lllllllilllllllllllllllllllllllllllllll 
    If      , 
    //      DIRWALKDATA   
    // ,       DirWalkRecurse 
    // ,  DirWalkRecurse 
    typedef struct { 
    HWND  hwndTreeLB;         //      
    int   nDepth;             //   
    BOOL  fRecurse;           //   TRUE    
    TCHAR szBuf[1000];        //     
    int   nindent;            //      
    BOOL  f0k;                //    
    BOOL  fIsDir:             //    
    WIN32_FIND_DATA FindData; //    
    } DIRWALKDATA, LPDIRWALKDATA; 
    /////////////////////////////////////////////////////////////////////////////// 
    
    //         
    // .   pDW->fRecurse,     
    //  -     DirWalkRecurse. 
    void DirWalkRecurse (LPDIRWALKDATA pDW) { 
    HANDLE hFind; 
    pDW->nDepth++; 
    pDW->n!ndent = 3 * pDW->nDepth; 
    _stprintf(pDW->szBuf, __TEXT("%*s"), pDW->nIndent, __TEXT("")): 
    GetCurrentDirectory(chDIMOF(pDW->szBuf) - pDW->n!ndent, 
    &pDW->szBur[pDW->nIndent]); 
    ListBox_Add8tring(pDW->hwndTreeLB, pDW->szBuf); 
    hFind = FindFirstFile(__TEXT("*.*"), &pDW->FindData); 
    pDW->fOk = (hFind '= INVALID_HANDLE_VALUE); 
    while (pDW->TOk) { 
    pDW->f!sDir = pDW->FindData.dwFileAttnbutes & FILE_ATTRIBUTE_DIRECTORY; 

    . . . 

    454 _____________________________Windows   


    . 14-3  () 

    if (!pDW->f!sDir :: (!pDW->fRecurse && IsChildDir(&pOW->FindOata))) { 
    _stprintf(pDW->szBuf, 
    pDW->f!sDir ? __TEXT("%*s[%s]") : __TEXT("/o*s%s"). 
    pDW->nIndent, __TEXT(""), 
    pDW->FindData.cFileName); 
    ListBdx_AddStnng(pDW->hwndTreeLB, pDW->szBuf); 
    } 
    pDW->fOk = FindNextFile(hFind, &pDW->FindData): 
    } 
    if (hFind != INVALID_HANDLE_VALUE) 
    FindClose(hFind); 
    if (pDW->fRecurse) { 
    //     
    hFind = FindFirstChildDir(__TEXT("*,*"). &pDW->FindData): 
    pDW->fOk = (hFind != INVALIOJANDLEJ/ALUE); 
    while (pDW->fOk) { 
    //     
    if (SetCurrentDirectory(pDW->FindData.cFileName)) { 
    
    //     . 
    // ,     pDW 
    //    . 
    DirWalkRecurse(pDW); 
    //       
    SetCurrentDirectory(__TEXT("..")); 
    pDW->fOk = FindNextChildDir(hFind, &pDW->FindData); 
     ; 
    if (hFind != INVALID_HANDLE_VALUE) 
    FindClose(hFind): 
    } 
    pDW->nDepth--; 
    i 
    I /         
    // .     DirWalkRecurse,  
    //    . 
    void DirWalk ( 
    HWND hwndTreeLB,     //    
    LPCTSTR pszRootPath, //     
    BOOL fRecurse) {     //   ,  TRUE 

    . . . 

    _____________________________ 14.   455 


    . 14-3  () 

    TCHAR szCurrDir[_MAX_DIR]; 
    DIRWALKDATA DW: 
    //    
    ListBox_ResetContent(hwndTreeLB); 
    //       
    QetCurrentDirectory(chDIMOF(szCurrOir), szCurrDir); 
    
    //    , 
    //       
    SetCurrentDirectory(pszRootPath); 
    
    // nDepth         
    // .  -1      
    //    . 
    DW.nDepth = -1; 
    DW.hwndTreeLB = hwndTreeLB; 
    DW.fRecurse = fRecurse; 
    
    //        
    DirWalkRecurse(&DW); 
    
    //    ,     
    //    
    SetCurrentDirectory(szCurrDir); 
    } 
    IIIII/I///IIHIIIIIIIIIII//III/I///I////II//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/II 
    HANDLE g_hChange = INVALID_HANDLE_VALUE; 
    int   g_nCount = 0; 
    llllllllllll/lllll/l/llllllllllllll/l/IIIIIIHIIII/lll/l/llllllllillllllllll/ll 
    void Dlg_ErrorBox (LPCTSTR pszSource) { 
    TCHAR szBur[100]; //     
    _stprintf(szBuf, __TEXT("%s reported error %lu"), pszSource, GetLastErrorO); 
    chMB(szBuf); 
    } 
    //llllll/llllllllllllllllllllll/l/lllll/llll//ll/lllllllltllll/l//t//IIIH/llll 
    DWORD Dlg_GetFilter (HWND hwnd) { 
    DWORD fdwFilter = 0; 
    if (Is"DlgButtonGhecked(hwnd, IDC_FILENAME)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_FILE_NAME; 

    . . . 

    456 _____________________________Windows   

    . 14-3  () 
    
    if (IsDlgButtonChecked(hwnd, IDC_DIRNAME)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_DIR_NAME; 
    
    if (IsDlgButtonChecked(hwnd, IDC_ATTRIBS)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_ATTRIBUTES: 
    
    if (IsDlgButtonChecked(hwnd, IDC_SIZEFLTR)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_SIZE; 
    
    if (IsDlgBLittonCriecked(hwnd, IDC_LASTWRITE)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_LAST_WRITE: 
    
    if (IsDlgButtonChecked(hwnd, IDC_LASTACCES8)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_LAST_ACCESS; 
    
    if (IsDlgButtonChecked(hwnd, IDC_CREATION)) 
    fdwFilter ;= FILE_NOTIFY_CHANGE_CREATION; 
    
    if (IsDlgButtonChecked(hwnd, IDC_SECURITY)) 
    fdwFilter := FILE_NOTIFY_CHANGE_SECURITY; 
    return(fdwFilter); 
    } 
    llllll/tlllllillll/lllll/lt/llllllll/IIIHIIII/llllllllll/llllllllllllllll/llll 
    II        
    //   FindFirstCnangeNotification:   
    //    -     
    BOOL Dlg_Validate (HWND hwnd) { 
    BOOL  fValid = FALSE; 
    TCHAR szPath[_MAX_DIR]; 
    
    // ,      
    if (0 != 01g_GetFilter(hwnd)) { 
    
    // ,     
    GetDlgItemText(hwnd, IDC_PATH, szPath, chDIMOF(szPath)); 
    fValid = SetCurrentDirectory(szPath); 
    } 
    return(fValld); 
    } 
    Illllllllllllllllllllllllllllllllllllllllllllllllllllllltllllllllllllllllllllll 
    void Dlg_CloseChange (HWND hwnd) < 
    BOOL fDisableFocus = (GetFocusO == GetDlgItem(hwnd, IDC_STOP)); 

    . . . 

    _____________________________ 14.   457 

    . 14-3  () 

    EnableWindow(GetDlgItem(hwnd, IDC_STOP), FALSE); 
    if (Dlg_Validate(hwnd)) { 
    EnableWindow(GetDlgItem(hwnd, IOG_START), TRUE); 
    if (fDisableFocus) { 
    SetFocus(GetDlgItem(hwnd, IDC_START)); 
    } 
    } else { 
    fDisableFocus = fDisableFocus ;! 
    (GetFocusO == GetDlgItem(hwnd. IDC_START)); 
    EnableWindow(GetDlgItem(hwnd, IDC_START), FALSE); 
    if (fDisableFocus) { 
    SetFocus(GetDlgItem(hwnd, IDC_INCSUBDIRS)); 
    \ 
    ! 
    t 
    if (INVALID_HANDLE_VALUE != g_hChange) { 
    if (!FindCloseGhangeNotification(g_hChange)) { 
    Dlg_ErrorBox(_J"EXT("FindCloseChangeNotification")); 
    } 
    g_hChange = INVALID_HANDLE_VALUE; 
    I 
    I 
    /////////////////////////////////////////////////////////////////////////////// 
    void Dlg_OpenChange (HWND hwnd) { 
    TCHAR szPath[_MAX_DIR]; 
    BOOL fDisableFocus = (GetFocusO == GetDlgItem(hwnd, IDC_START)); 
    Dlg_CloseChange(hwnd); 
    g_nCount = 0; 
    SetDlgItemInt(hwnd, IDC_NCOUNT, g_nCount, FALSE); 
    GetDlgItemText(hwnd, IDC_PATH, szPath, chDIMOF(szPath)); 
    g_hChange = FindFirstChangeNotification(szPath, 
    IsDlgButtonChecked(hwnd, IDC_INCSUBDIRS), 
    Dlg_GetFilter(hwnd)); 
    if (INVALID_HANDLE_VALUE == g_hChange) < 
    Dlg_ErrorBox(__TEXT("FindFirstChangeNotification")); 
    g_hChange = INVALID_HANDLE_VALUE: 
    } else { 
    EnableWindow(GetDlgItem(hwnd, IDC_START), FALSE); 
    EnableWindow(GetDlgItem(hwnd, IDC_STOP), TRUE); 

    . . . 

    458 ____________________________Windows   

    . 14-3  () 

    if (fDisableFocus) { 
    SetFocus(GetDlgItem(hwnd, IDC_STOP)); 
    } DirWalk(GetDlgItem(hwnd, IDC_TREE), szPath, 
    IsDlgButtonChecked(hwnd, IDC_INCSUBDIRS)); 
    } 
    I 
    1111111111111111111111111111111111111111111111111111111111111111111111111111111 
    
    BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    TCHAR szPath[_MAX_DIR]; 
    
    //      
    chSETDLGICONS(hwnd, IOI_FILECHNG, IDI_FILECHNQ); 
    
    //      
    GetCurrentDirectory(chDIMOF(szPath), szPath); 
    SetDlgItemText(hwnd, IDC_PATH, szPath); 
    Dlg_CloseChange(hwnd); 
    return(TRUE); 
    1 
    Illllllllllll/lltllllll/lllll/ll/l/ll/lllllllllll/llllllllllllllllllll/llllllll 
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotify) { 
    switch (id) { 
    case IDC_PATH: 
    
    //       
    //  ,    
    if (EXCHANGE == codeNotify) { 
    Dlg_CloseChange(hwnd); 
    } 
    break; 
    case IDC.JNGSUBDIRS: 
    case IDC_FILENAME: 
    case IDC_DIRNAME: 
    case IDC_ATTRIBS: 
    case IDC_SIZEFLTR: 
    case IDC_LASTWRITE: 
    case IDC_LASTACCESS: 
    case IDC_CREATION: 
    case IDC_SECURITY: 
    case IDC_STOP: 
    Dlg_CloseChange(hwnd); 
    break; 

    . . . 

    _____________________________ 14.   459 

    . 14-3  () 

    case IDC_START: 
    Dlg_OpenChange(hwnd); 
    break: 
    case IDCANCEL: 
    Dlg_CloseChange(hwnd); 
    PostQuitMessage(O); 
    break; 
    } 
    } 
    tllllllllllllllllllllllllllllllllllllllllllllllllllllll/lllll/lllli/lllllllllll 
    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM 
IParam) { 
    switch (uMsg) { 
    chHANDLE_DLQMSG(hwnd, WMJNITDIALOG, Dlg_0nlnit0ialog); 
    chHANDLE_DLGMSG(hwnd, WM_COMMAND, DlgJ3nCommand); 
    } 
    return(FALSE): 
    } 
    IIIIIIIIIIIIHIIIIII/1111111111111/1//1111111111111//1111/1111111111111111/1111 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    HWND  hwnd; 
    MSG   msg: 
    DWORD dwResult; 
    BOOL  fQuit = FALSE, fWalt4FileChanges; 
    TCHAR szPath[_MAX_DIRJ; 
    chWARNIFUNICODEUNDERWIN95(); 
    //      , 
    // .."       
    hwnd = CreateDialog(hinstExe, MAKEINTRESOURCE(IDD_FILECHNG). NULL, Dlg_Proc); 
    
    //     WM_QUIT 
    while (!fQuit) { 
    
    //          ? 
    fWait4FileChanges = (INVALID_HANDLE_VALUE != g_hChange); 
    
    //  , ,      
    //      
    dwResult = MsgWaitForMultipleObjects( 
    (fWait4FileChanges) ? 1 : , 
    &g_hChange, FALSE, INFINITE, QS_ALLEVENTS): 

    . . . 

    460 ___________________________Windows   

    . 14-3  () 

    if (fWait4FileChanges && (WAIT_OBJECT_0 == dwResult)) { 
    //        ; 
    //    
    
    //     
    Set01gltemlnt(hwnd, IDC_NCOUNT, ++g_nCount, FALSE); 
    
    //        
    //    ,    ,  
    //   Include Subdirectories 
    GetDlgItemText(hwnd, IDC_PATH, szPath, chDIMOF(szPath)); 
    
    DirWalk(Get01gItefn(hwnd, IDC_TREE), szPath, 
    IsDlgButtonChecked(hwnd, IDC_INCSUBDIRS)): 
    
    //  ,     
    FindNextChangeNotification(g_hChange); 
    } else { 
    
    //  , ..        
    // ; "" ,    
    while (PeekMessage(&msg, NULL, 0, 0. PM_REMOVE)) { 
    
    //  IsDialogMessage,     
    //       
    if (! IsDialogMessage(hwnd, &msg)) { 
    if (msg.message == WM_QUIT) { 
    //   WM_QUIT, 
    //     
    fQuit = TRUE; 
    } else { 
    
    //   WM_QUIT;   
    //     
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 
    } // if (! IsDialogMessageO) 
    } //      
    } //         
    } // while (!fQuit) 
    //  ; 
    //     
    DestroyWindow(hwnd); 
    return(O); 
    } 
    I I 1111/11111111/11111111/11111111 /   1111111111111111111/11111/1111111 

    _____________________________ 14.   461 


        

         .      
 ,     .    
   ,      .  
    ,     . 

       

         .    : 

    BOOL GetBinaryType(LPCTSTR IpApplicationName, LPDWORD IpBinaryType); 

    ,    ,        ,  
        DWORD,   
  IpBinaryType.    : 

            

    SCS_32BIT_BINARY         Win32-poee 
    SCS_DOS_BINARY           MS-DOS 
    SCS_OS216_BINARY         16-  OS/2 
    SCS_PIF_BINARY           PIF-   MS-DOS 
    SCS_POSIX_BINARY         POSIX- 
    SCS_WOW_BINARY         16-  Windows 


    VWINDOWS/ 
     Windows 95  GetBinaryType no      
 FALSE;   GetLastError   ERROR_CALL_NOTJMPLEMENTED. 


      

            
 CreateFile.      dwAttrsAndFlags.   
    ,  : 

    DWORD GetFileAttributes(LPTSTR IpszFileName); 

       ,     . 
,  ,     AND  
   : 

    FILE_ATTRIBUTE_ARCHIVE 
    FILE_ATTRIBUTE_COMPRESSED 
    FILE_ATTRIBUTE_DIRECTORY 
    FILE_ATTRIBUTE_HIDDEN 
    FILE_ATTRIBUTE_NORMAL 
    FILE_ATTRIBUTE_OFFLINE 
    FILE_ATTRIBUTE_READONLY 
    FILE_ATTRIBUTE_SYSTEM 
    FILE_ATTRIBUTE_TEMPORARY 


    462 _____________________________Windows   


    (     .  15.) 

     GetFileAttributes, Windows NT 4   : 

    BOOL GetFileAttributesEx(LPCTSTR IpFileName, 
    GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID IpFilelnformation); 

        ,  GetFileAttributes.    
        . 
GetFileAttributesEx     : GetFileAttributes, 
GetFileTimes (   ), GetFileSize (     ). 
    ,   IpFileName     ,  
  .  fInfoLevelId ,   
  .          
  GetFileExInfoStandard.     
IpFileInformation     WIN32_FILE_ATTRIBUTE_DATA: 

    typedef struct _WIN32_FILE_ATTRIBUTE_DATA { 
    DWORD     dwFileAttributes; 
    FILETIME ftCreationTime; 
    FILETIME ftLastAccessTime; 
    FILETIME ftLastWriteTime; 
    DWORD     nFileSizeHigh; 
    DWORD     nFileSizeLow; 
    } WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; 

        ;   : 

    BOOL SetFileAttributes(LPTSTR IpFileName. DWORD dwFileAttributes);         
                         : 
       TRUE   dwFileAttributes,   
  . ,       CALC.EXE: 

    DWORD dwFileAttributes = GetFileAttributes("CALC.EXE"); 
    dwFileAttributes &= ~FILE_ATTRIBUTE_ARCHIVE: 
    SetFileAttributesC'CALC.EXE", dwFileAttributes); 

    SetFileAttributes   . ,  
    ( ),   FILE_ATTRIBUTE_DIRECTORY. 
   ,    FILE_ATTRIBUTE_COMPRESSED.  
   DeviceIoControl    
FSCTL_SET_COMPRESSION. ( ,    ., 
  Windows NT.) 

      

        GetFileSize: 

    DWORD GetFileSize(HANDLE hFile, LPDWORD IpdwFileSizeHigh); 

       ,          
   hFile.     CreateFile 
(.  15). GetFileSize   32  ,  
 .    32 ,    IpdwFileSizeHigh 
   DWORD,     .    
        SetEndOfFile. 
     99%      ,  GetFileSize 
 .        ,  GetCompressedFileSize: 

    DWORD GetCompressedFileSize(LPCTSTR IpFileName, LPDWORD IpFileSizeHigh); 

    _____________________________ 14.   463 

       GetFileSize      ;   
     .   IpFileSizeHigh   
    ,     GetFileSize. 

       

     MS-DOS (a ,   FAT,   Windows 95  Windows 
NT 3.5)            
  .    FAT,    NTFS   3  : 
    ,       ,   
  .      : 

    BOOL GetFileTime(HANDLE hFile, LPFILETIME IpftCreation, LPFILETIME 
IpftLastAccess, LPFILETIME IpftLastWrite): 

        GetFileSize,   GetFileTime   ,  
     hFile.  3    
  FILETIME: 

    typedef struct _FILETIME { 
    DWORD dwLowDateTime; 
    DWORD dwHighDateTime; 
    } FILETIME, *PFILETIME, *LPFILETIME; 

          ,    
IpftCreation  NULL. To       , 
   . 
       FILETIME   64- ,  
 100- ,   1  1601 . , 
      ,         
 . ,    ? -, Microsoft   
,       ,    
    ,   
    . 
    ,   ,    .  : 

    LONG CompareFileTime( LPFILETIME lpft-1, LPFILETIME lpft2); 

         : 

      CompareFileTime      
    -1                     Ipfti  ( ),  lpft2 
                         lpft2  lpft2 
    +1                     Ipfti  ( ),  lpft2 

      CompareFileTime  ,     
-      : 

    IResult = GompareFileTime(&ftLastAccess, &ftLastWrite); 
    if (IResult == 0) { 
    //      
    } else { 
    //       
    } 

     ,         ? 
    FILETIME   SYSTEMTIME,  : 

    464 _____________________________Windows   

    BOOL FileTimeToSystemTime(LPFILETIME Ipft, LPSYSTEMTIME Ipst); 

     

    BOOL SystemTimeToFileTime(LPSYSTEMTIME Ipst, LPFILETIME Ipft); 

          FILETIME  SYSTEMTIME. 

     SYSTEMTIME  : 

    typedef struct _SYSTEMTIME { 
    WORD wYear; 
    WORD wMonth; 
    WORD wDayOtWeek; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond: 
    WORD wMilliseconds; 
    } SYSTEMTIME; 
    typedef SYSTEMTIME *PSYSTEMTIME, *LPSYSTEMTIME; 

           ,  
. ,    SYSTEMTIME  FILETIME  
wDayOfWeek  SYSTEMTIME . 
           ( )  : 

    BOOL FileTimeToLocalFileTime(LPFILETIME Ipft, LPFILETIME IpftLocal): 

     

    BOOL LdcalFileTimeToFileTinie(LPFILETIME IpftLocal, LPFILETIME Ipft); 

        2    FILETIME.  
:           ,   
  . 
         MS-DOS  FAT       
        ,    
,   FILETIME   ,   MS-DOS, 
  : 

    BOOL FileTimeToDosDateTime(LPFILETIME Ipft, LPWORD IpwDOSDate, LPWORD IpwDOSTime); 

     

    BOOL DosDateTlmeToFileTime(WORD wDOSDate, WORD wDOSTime, LPFILETIME Ipft); 

    FileTimeToDosDateTime    FILETIME,  
  ,     2   WORD,  
MS-DOS,    ,   . 

    /)*\ 
     Windows 95  FileTimeToDosDateTime  DosDateTimeToFileTime 
    31  2099 ,   Windows NT    
31  2107 .                                                          
   : 
        ,  ,  GetFileTime: 

    BOOL SetFileTime(HANDLE hFile, LPFILETIME IpftCreation, 
    LPFILETIME IpftLastAccess, LPFILETIME IpftLastWrite): 

         - ,   
  NULL. 
             GetFileInformationByHandle". 

    _____________________________ 14.   465 


    BOOL GetFileInformationByHandle(HANDLE hFile, 
    LPBY_HANDLE_FILE_INFORMATION IpFilelnformation); 

            (hFile)  
  BY_HANDLE_FILE_INFORMATION,     : 

    typedef struct _BY_HANDLE_FILE_INFORMATION { 
    DWORD dwFileAttributes; 
    FILETIME ftCreationTime; 
    FILETIME ftLastAccessTime; 
    FILETIME ftLastWriteTime; 
    DWORD dwVolumeSerialNumber; 
    DWORD nFileSizeHigh: 
    DWORD nFileSizeLow; 
    DWORD nNumberOfLinks; 
    DWORD nFileIndexHigh; 
    DWORD nFileIndexLow; 
    } BY_HANDLE_FILE_INFORMATION, 
    *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION; 

              .  
,    dwFileAttributes,      
 ftCreationTime, ftLastAccessTime  ftLastWriteTime,    
dwVolumeSerialNumber   ,    ,   
 (  nFileSizeHigh  nFileSizeLow).     
 (  POSIX  Windows NT)      nNumberOfLinks. 
            
,      nFileIndexHigh  
nFileIndexLow.      ,   
   .        
 ,     ( )      
 . 

       

            . 
Win32   ,       : 

    DWORD GetTempPath(DWORD nBufferLength, LPTSTR IpBuffer); 
    UINT GetTempFileName(LPCTSTR IpPathName, LPCTSTR IpPreflxString, 
    UINT uUnique, LPTSTR IpTempFileName); 

    GetTempPath   ,     IpBuffer, 
   ,      .  
  ,   : 
    1.     ,      
 . 
    2.    ,   TEMP. 
    3.     ,  TEMP,   . 
     GetTempFileName    ,   
.  IpPathName  ,     
 .  ,     GetTempPath,   
    IpPathName.  IpPrefixString  
  ,       . 

    466 ______________________________Windows   

     uUnique  GetTempFileName    0. 
          
 .        ,  
   ,    .   
GetTempFileName        ,    
  IpTempFileName. 
      uUnique   0, GetTempFileName     
   ,   uUnique (  
);      ,    IpTempFileName.  
,    uUnique      
 ,   .     
   CreateFile (.  15). 