📄 fileconv.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 + -