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

📄 fileconv.cpp

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

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include "msc.h"

#include "access.h"
#include "fileconv.h"
#include "filename.h"
#include "filetime.h"
#include "oemio.h"
#include "stringex.h"


// Some compilers do not support
#ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
#endif

#define FILE_ATTRIBUTES_THROUGH  ( FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED )



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



// 僼傽僀儖柤巜掕僐儞僶乕僞乮ANSI斉乯
// szExtension 偼 . 偑偁偭偰傕側偔偰傕傛偄
// szExtension 偵 NULL 傪巜掕偟偨偲偒偼丄昗弨弌椡偵弌椡偡傞
// 栠傝抣偼師偺捠傝
//        0      :   惉岟
//        1 埲忋 :   僐儞僶乕僞偺僄儔乕傪偦偺傑傑曉偡
//       -1      :   傾僋僙僗嫅斲乮FILECONV_ERROR_ACCESS乯
//       -2      :   奼挘巕晄惓乮FILECONV_ERROR_EXTENSION乯
//       -3      :   儊儌儕乕偑懌傝側偄乮FILECONV_ERROR_MEMORY乯

int FileConvertA ( const char *szSrcFileName, const char *szExtension, int ( WINAPI *pFunction ) ( const char *szSrcFileName, const char *szDstFileName, int nSrcCodePage, int nDstCodePage, void *pFunctionData ), int nSrcCodePage, int nDstCodePage, void *pFunctionData, unsigned long dwMode ) {

   char *szDstFileName = NULL ;

   int IsDisplay = 0 ;                             // 1 : 宱夁傪昞帵

   int IsSrcDstReversed = 0 ;
   int nResult ;

   FILETIME CreationTime, LastAccessTime, LastWriteTime ;

   static const char szConverting [] = "now converting " ;
   static const char szConverted  [] = "converted      " ;


   // 弌椡僼傽僀儖柤傪巜掕偟側偄応崌
   if ( szExtension == NULL ) {
      if ( ! fisatty ( stdout ) ) IsDisplay = 1 ;
   }
   // 奼挘巕傪巜掕偟偨応崌
   else {

      if ( *szExtension == '.' ) szExtension ++ ;

      szDstFileName = strdup_expand ( szSrcFileName, MAX_PATH, strlen ( szExtension ) + 1 ) ;   // 僺儕僆僪傪晅壛偡傞偨傔
      if ( ! szDstFileName ) { nResult = FILECONV_ERROR_MEMORY ; goto CAUGHT_ERROR ; }

      ChangeExtensionA ( szDstFileName, szExtension ) ;
      if ( strlen ( szDstFileName ) + 1 > MAX_PATH ) { nResult = FILECONV_ERROR_MEMORY ; goto CAUGHT_ERROR ; }
      if ( ! stricmp ( szDstFileName, szSrcFileName ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }

      if ( ( dwMode & FILECONV_SAVE_TIMESTAMP ) && GetFileTimeExA ( szSrcFileName, & CreationTime, & LastAccessTime, & LastWriteTime ) ) dwMode &= ~ FILECONV_SAVE_TIMESTAMP ;

      if ( ! stricmp ( szExtension, "BAK" ) ) {
         IsSrcDstReversed = 1 ;
         if ( ! IsFileAccessibleA ( szSrcFileName, FILE_ACCESS_WRITE | FILE_ACCESS_FILE ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
         if ( ! IsFileAccessibleA ( szDstFileName, FILE_ACCESS_WRITE | FILE_ACCESS_FILE ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
         DeleteFileA ( szDstFileName ) ;
         if ( ! MoveFileA ( szSrcFileName, szDstFileName ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
      }
      else {
         if ( ! IsFileAccessibleA ( szDstFileName, FILE_ACCESS_WRITE | FILE_ACCESS_FILE ) ) {
            if ( IsFileAccessibleA ( szDstFileName, FILE_ACCESS_EXIST ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
            if ( ! IsFileAccessibleA ( szSrcFileName, FILE_ACCESS_EXIST | FILE_ACCESS_FILE ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
            nResult = FILECONV_ERROR_EXTENSION ; goto CAUGHT_ERROR ;
         }
      }
      IsDisplay = 1 ;
   }

   if ( dwMode & FILECONV_NO_ECHO ) IsDisplay = 0 ;


   if ( IsDisplay ) {
      fputs_line ( szConverting, stderr ) ;
      fputs_line ( szSrcFileName, stderr ) ;
   }


   if ( IsSrcDstReversed ) nResult = pFunction ( szDstFileName, szSrcFileName, nSrcCodePage, nDstCodePage, pFunctionData ) ;
   else                    nResult = pFunction ( szSrcFileName, szDstFileName, nSrcCodePage, nDstCodePage, pFunctionData ) ;
   if ( nResult ) goto CAUGHT_ERROR ;


   if ( ( dwMode & FILECONV_SAVE_TIMESTAMP ) && szDstFileName ) {
      if ( IsSrcDstReversed ) SetFileTimeExA ( szSrcFileName, & CreationTime, & LastAccessTime, & LastWriteTime ) ;
      else                    SetFileTimeExA ( szDstFileName, & CreationTime, & LastAccessTime, & LastWriteTime ) ;
   }

   if ( dwMode & FILECONV_TO_HIDDEN ) {
      if ( IsSrcDstReversed ) SetFileAttributesA ( szDstFileName, ( GetFileAttributesA ( szSrcFileName ) & FILE_ATTRIBUTES_THROUGH ) | FILE_ATTRIBUTE_HIDDEN ) ;
      else                    SetFileAttributesA ( szSrcFileName, ( GetFileAttributesA ( szDstFileName ) & FILE_ATTRIBUTES_THROUGH ) | FILE_ATTRIBUTE_HIDDEN ) ;
   }


   if ( IsDisplay ) {
      fputs_line ( "\r", stderr ) ;
      fputs ( szConverted, stderr ) ;
      fputs ( szSrcFileName, stderr ) ;
      fputs ( "\n", stderr ) ;
   }


   CAUGHT_ERROR :
   free ( szDstFileName ) ;
   return nResult ;
}



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



// 僼傽僀儖柤巜掕僐儞僶乕僞乮UNICODE斉乯
// szExtension 偼 . 偑偁偭偰傕側偔偰傕傛偄
// szExtension 偵 NULL 傪巜掕偟偨偲偒偼丄昗弨弌椡偵弌椡偡傞
// 栠傝抣偼師偺捠傝
//        0      :   惉岟
//        1 埲忋 :   僐儞僶乕僞偺僄儔乕傪偦偺傑傑曉偡
//       -1      :   傾僋僙僗嫅斲乮FILECONV_ERROR_ACCESS乯
//       -2      :   奼挘巕晄惓乮FILECONV_ERROR_EXTENSION乯
//       -3      :   儊儌儕乕偑懌傝側偄乮FILECONV_ERROR_MEMORY乯

int FileConvertW ( const wchar_t *szSrcFileName, const wchar_t *szExtension, int ( WINAPI *pFunction ) ( const wchar_t *szSrcFileName, const wchar_t *szDstFileName, int nSrcCodePage, int nDstCodePage, void *pFunctionData ), int nSrcCodePage, int nDstCodePage, void *pFunctionData, unsigned long dwMode ) {

   wchar_t *szDstFileName = NULL ;

   int IsDisplay = 0 ;                             // 1 : 宱夁傪昞帵

   int IsSrcDstReversed = 0 ;
   int nResult ;

   FILETIME CreationTime, LastAccessTime, LastWriteTime ;

   static const wchar_t szConverting [] = L"now converting " ;
   static const wchar_t szConverted  [] = L"converted      " ;


   // 弌椡僼傽僀儖柤傪巜掕偟側偄応崌
   if ( szExtension == NULL ) {
      if ( ! fisatty ( stdout ) ) IsDisplay = 1 ;
   }
   // 奼挘巕傪巜掕偟偨応崌
   else {

      if ( *szExtension == '.' ) szExtension ++ ;

      szDstFileName = wcsdup_expand ( szSrcFileName, MAX_LONG_PATH, wcslen ( szExtension ) + 1 ) ; // 僺儕僆僪傪晅壛偡傞偨傔
      if ( ! szDstFileName ) { nResult = FILECONV_ERROR_MEMORY ; goto CAUGHT_ERROR ; }

      ChangeExtensionW ( szDstFileName, szExtension ) ;
      if ( wcslen ( szDstFileName ) + 1 > MAX_LONG_PATH ) { nResult = FILECONV_ERROR_MEMORY ; goto CAUGHT_ERROR ; }
      if ( ! wcsicmp ( szDstFileName, szSrcFileName ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }

      if ( ( dwMode & FILECONV_SAVE_TIMESTAMP ) && GetFileTimeExW ( szSrcFileName, & CreationTime, & LastAccessTime, & LastWriteTime ) ) dwMode &= ~ FILECONV_SAVE_TIMESTAMP ;

      if ( ! wcsicmp ( szExtension, L"BAK" ) ) {
         IsSrcDstReversed = 1 ;
         if ( ! IsFileAccessibleW ( szSrcFileName, FILE_ACCESS_WRITE | FILE_ACCESS_FILE ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
         if ( ! IsFileAccessibleW ( szDstFileName, FILE_ACCESS_WRITE | FILE_ACCESS_FILE ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
         DeleteFileW ( szDstFileName ) ;
         if ( ! MoveFileW ( szSrcFileName, szDstFileName ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
      }
      else {
         if ( ! IsFileAccessibleW ( szDstFileName, FILE_ACCESS_WRITE | FILE_ACCESS_FILE ) ) {
            if ( IsFileAccessibleW ( szDstFileName, FILE_ACCESS_EXIST ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
            if ( ! IsFileAccessibleW ( szSrcFileName, FILE_ACCESS_EXIST | FILE_ACCESS_FILE ) ) { nResult = FILECONV_ERROR_ACCESS ; goto CAUGHT_ERROR ; }
            nResult = FILECONV_ERROR_EXTENSION ; goto CAUGHT_ERROR ;
         }
      }
      IsDisplay = 1 ;
   }

   if ( dwMode & FILECONV_NO_ECHO ) IsDisplay = 0 ;


   if ( IsDisplay ) {
      fputws_line ( szConverting, stderr ) ;
      fputws_line ( szSrcFileName, stderr ) ;
   }


   if ( IsSrcDstReversed ) nResult = pFunction ( szDstFileName, szSrcFileName, nSrcCodePage, nDstCodePage, pFunctionData ) ;
   else                    nResult = pFunction ( szSrcFileName, szDstFileName, nSrcCodePage, nDstCodePage, pFunctionData ) ;
   if ( nResult ) goto CAUGHT_ERROR ;


   if ( ( dwMode & FILECONV_SAVE_TIMESTAMP ) && szDstFileName ) {
      if ( IsSrcDstReversed ) SetFileTimeExW ( szSrcFileName, & CreationTime, & LastAccessTime, & LastWriteTime ) ;
      else                    SetFileTimeExW ( szDstFileName, & CreationTime, & LastAccessTime, & LastWriteTime ) ;
   }

   if ( dwMode & FILECONV_TO_HIDDEN ) {
      if ( IsSrcDstReversed ) SetFileAttributesW ( szDstFileName, ( GetFileAttributesW ( szSrcFileName ) & FILE_ATTRIBUTES_THROUGH ) | FILE_ATTRIBUTE_HIDDEN ) ;
      else                    SetFileAttributesW ( szSrcFileName, ( GetFileAttributesW ( szDstFileName ) & FILE_ATTRIBUTES_THROUGH ) | FILE_ATTRIBUTE_HIDDEN ) ;
   }


   if ( IsDisplay ) {
      fputws_line ( L"\r", stderr ) ;
      fputws ( szConverted, stderr ) ;
      fputws ( szSrcFileName, stderr ) ;
      fputws ( L"\n", stderr ) ;
   }


   CAUGHT_ERROR :
   free ( szDstFileName ) ;
   return nResult ;
}



⌨️ 快捷键说明

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