⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 access.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
字号:
// access.cpp

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include "msc.h"
#include "access.h"
#include "filename.h"
#include "stringex.h"


// 偹傫偺偨傔 FILE_TYPE_REMOTE (0x8000) 傪偼偢偡
#define GetFileType(h)   ( GetFileType ( h ) & ~ FILE_TYPE_REMOTE )


#define FILE_ACCESS_TESTSHARE    ( FILE_ACCESS_EXIST | FILE_ACCESS_READ | FILE_ACCESS_WRITE | FILE_ACCESS_VALID )
#define FILE_ACCESS_TESTTYPE     ( FILE_ACCESS_FILE | FILE_ACCESS_DIRECTORY | FILE_ACCESS_DEVICE )



//////////////////////////////
//          ANSI斉          //
//////////////////////////////



static int IsReservedDeviceNameA ( const char *szFileName ) ;



// 僼傽僀儖偺傾僋僙僗尃傪専嵏乮ANSI斉乯
// dwFlags 偵巜掕偝傟偨忦審偵崌偆側傜偽 0 埲奜傪曉偡
int IsFileAccessibleA ( const char *szFileName, unsigned long dwFlags ) {


   if ( ( dwFlags & FILE_ACCESS_TESTTYPE ) == 0 ) dwFlags |= FILE_ACCESS_TESTTYPE ;
   if ( ( dwFlags & FILE_ACCESS_TESTSHARE ) == 0 ) dwFlags |= FILE_ACCESS_EXIST ;


   // 僨僶僀僗偑懚嵼
   if ( IsReservedDeviceNameA ( szFileName ) ) {
      if ( dwFlags & FILE_ACCESS_DEVICE ) {
         return 1 ;
      }
   }
   else {
      unsigned long dwFileAttributes = GetFileAttributesA ( szFileName ) ;
      if ( dwFileAttributes != (unsigned long) -1 ) {
         // 僨傿儗僋僩儕偑懚嵼
         if ( dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
            if ( dwFlags & FILE_ACCESS_DIRECTORY ) {
               if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
                  return 1 ;
               }
               if ( dwFlags & FILE_ACCESS_READ ) {
                  return 1 ;
               }
               if ( dwFlags & FILE_ACCESS_WRITE ) {
                  if ( ! ( dwFileAttributes & FILE_ATTRIBUTE_READONLY ) ) return 1 ;
               }
            }
         }
         // 僼傽僀儖偑懚嵼
         else {
            if ( dwFlags & FILE_ACCESS_FILE ) {
               if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
                  return 1 ;
               }
               if ( dwFlags & FILE_ACCESS_READ ) {
                  HANDLE hFile ;
                  if ( ( hFile = CreateFileA ( szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
                     unsigned long dwFileType = GetFileType ( hFile ) ;
                     CloseHandle ( hFile ) ;
                     if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
                  }
               }
               if ( dwFlags & FILE_ACCESS_WRITE ) {
                  HANDLE hFile ;
                  if ( ( hFile = CreateFileA ( szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
                     unsigned long dwFileType = GetFileType ( hFile ) ;
                     CloseHandle ( hFile ) ;
                     if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
                  }
               }
            }
         }
      }
      // 僨傿儗僋僩儕傑偨偼僼傽僀儖偑懚嵼偟側偄
      else {
         if ( dwFlags & ( FILE_ACCESS_FILE | FILE_ACCESS_DIRECTORY ) ) {
            if ( dwFlags & ( FILE_ACCESS_WRITE | FILE_ACCESS_VALID ) ) {
               HANDLE hFile ;
               if ( ( hFile = CreateFileA ( szFileName, GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ) != INVALID_HANDLE_VALUE ) {
                  unsigned long dwFileType = GetFileType ( hFile ) ;
                  CloseHandle ( hFile ) ;
                  if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
               }
            }
         }
      }
   }


   return 0 ;
}



// 梊栺偝傟偨僨僶僀僗柤偐偳偆偐曉偡
static int IsReservedDeviceNameA ( const char *szFileName ) {

   static const char szLongPathHead [] = "\\\\?\\" ;     // for "\\?\C:\<path>", "\\?\UNC\<server>\<share>"
   if ( ! strheadcmp ( szFileName, szLongPathHead ) ) return 0 ;

   szFileName = GetFileNameA ( szFileName ) ;
   if ( ! szFileName ) return 0 ;

   char szTmp [ MAX_PATH ] ;
   strlcpy ( szTmp, szFileName, MAX_PATH ) ;

   while ( GetExtensionA ( szTmp ) ) ChangeExtensionA ( szTmp, NULL ) ;

   if ( ! stricmp ( szTmp, "CON" ) ) return 1 ;
   if ( ! stricmp ( szTmp, "PRN" ) ) return 1 ;
   if ( ! stricmp ( szTmp, "AUX" ) ) return 1 ;
   if ( ! stricmp ( szTmp, "CLOCK$" ) ) return 1 ;
   if ( ! stricmp ( szTmp, "NUL" ) ) return 1 ;

   if ( ! strheadicmp ( szTmp, "COM" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;
   if ( ! strheadicmp ( szTmp, "LPT" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;

   return 0 ;
}



//////////////////////////////
//         UNICODE斉        //
//////////////////////////////



static int IsReservedDeviceNameW ( const wchar_t *szFileName ) ;



// 僼傽僀儖偺傾僋僙僗尃傪専嵏乮UNICODE斉乯
// dwFlags 偵巜掕偝傟偨忦審偵崌偆側傜偽 0 埲奜傪曉偡
int IsFileAccessibleW ( const wchar_t *szFileName, unsigned long dwFlags ) {


   if ( ( dwFlags & FILE_ACCESS_TESTTYPE ) == 0 ) dwFlags |= FILE_ACCESS_TESTTYPE ;
   if ( ( dwFlags & FILE_ACCESS_TESTSHARE ) == 0 ) dwFlags |= FILE_ACCESS_EXIST ;


   // 僨僶僀僗偑懚嵼
   if ( IsReservedDeviceNameW ( szFileName ) ) {
      if ( dwFlags & FILE_ACCESS_DEVICE ) {
         return 1 ;
      }
   }
   else {
      unsigned long dwFileAttributes = GetFileAttributesW ( szFileName ) ;
      if ( dwFileAttributes != (unsigned long) -1 ) {
         // 僨傿儗僋僩儕偑懚嵼
         if ( dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
            if ( dwFlags & FILE_ACCESS_DIRECTORY ) {
               if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
                  return 1 ;
               }
               if ( dwFlags & FILE_ACCESS_READ ) {
                  return 1 ;
               }
               if ( dwFlags & FILE_ACCESS_WRITE ) {
                  if ( ! ( dwFileAttributes & FILE_ATTRIBUTE_READONLY ) ) return 1 ;
               }
            }
         }
         // 僼傽僀儖偑懚嵼
         else {
            if ( dwFlags & FILE_ACCESS_FILE ) {
               if ( dwFlags & ( FILE_ACCESS_EXIST | FILE_ACCESS_VALID ) ) {
                  return 1 ;
               }
               if ( dwFlags & FILE_ACCESS_READ ) {
                  HANDLE hFile ;
                  if ( ( hFile = CreateFileW ( szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
                     unsigned long dwFileType = GetFileType ( hFile ) ;
                     CloseHandle ( hFile ) ;
                     if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
                  }
               }
               if ( dwFlags & FILE_ACCESS_WRITE ) {
                  HANDLE hFile ;
                  if ( ( hFile = CreateFileW ( szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) {
                     unsigned long dwFileType = GetFileType ( hFile ) ;
                     CloseHandle ( hFile ) ;
                     if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
                  }
               }
            }
         }
      }
      // 僨傿儗僋僩儕傑偨偼僼傽僀儖偑懚嵼偟側偄
      else {
         if ( dwFlags & ( FILE_ACCESS_FILE | FILE_ACCESS_DIRECTORY ) ) {
            if ( dwFlags & ( FILE_ACCESS_WRITE | FILE_ACCESS_VALID ) ) {
               HANDLE hFile ;
               if ( ( hFile = CreateFileW ( szFileName, GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ) != INVALID_HANDLE_VALUE ) {
                  unsigned long dwFileType = GetFileType ( hFile ) ;
                  CloseHandle ( hFile ) ;
                  if ( dwFileType == FILE_TYPE_DISK ) return 1 ;
               }
            }
         }
      }
   }


   return 0 ;
}



// 梊栺偝傟偨僨僶僀僗柤偐偳偆偐曉偡
// 僷僗柤側偟偺僼傽僀儖柤傪巜掕偡傞
static int IsReservedDeviceNameW ( const wchar_t *szFileName ) {

   static const wchar_t szLongPathHead [] = L"\\\\?\\" ;    // for "\\?\C:\<path>", "\\?\UNC\<server>\<share>"
   if ( ! wcsheadcmp ( szFileName, szLongPathHead ) ) return 0 ;

   szFileName = GetFileNameW ( szFileName ) ;
   if ( ! szFileName ) return 0 ;

   wchar_t szTmp [ MAX_PATH ] ;
   wcslcpy ( szTmp, szFileName, MAX_PATH ) ;

   while ( GetExtensionW ( szTmp ) ) ChangeExtensionW ( szTmp, NULL ) ;

   if ( ! wcsicmp ( szTmp, L"CON" ) ) return 1 ;
   if ( ! wcsicmp ( szTmp, L"PRN" ) ) return 1 ;
   if ( ! wcsicmp ( szTmp, L"AUX" ) ) return 1 ;
   if ( ! wcsicmp ( szTmp, L"CLOCK$" ) ) return 1 ;
   if ( ! wcsicmp ( szTmp, L"NUL" ) ) return 1 ;

   if ( ! wcsheadicmp ( szTmp, L"COM" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;
   if ( ! wcsheadicmp ( szTmp, L"LPT" ) && szTmp [ 3 ] >= '1' && szTmp [ 3 ] <= '9' && ! szTmp [ 4 ] ) return 1 ;

   return 0 ;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -