📄 dosname.c
字号:
/* Unix/HPFS filename translation for FAT file systems *//* (with special unzip modifications: sflag) *//* Author: Kai Uwe Rommel */#include "unzip.h"extern int sflag; /* user wants to allow blanks (e.g., "EA DATA. SF") */void ChangeNameForFAT(char *name){ char *src, *dst, *next, *ptr, *dot, *start; static char invalid[] = ":;,=+\"[]<>| \t"; if ( isalpha(name[0]) && (name[1] == ':') ) start = name + 2; else start = name; src = dst = start; if ( (*src == '/') || (*src == '\\') ) src++, dst++; while ( *src ) { for ( next = src; *next && (*next != '/') && (*next != '\\'); next++ ); for ( ptr = src, dot = NULL; ptr < next; ptr++ ) if ( *ptr == '.' ) { dot = ptr; /* remember last dot */ *ptr = '_'; } if ( dot == NULL ) for ( ptr = src; ptr < next; ptr++ ) if ( *ptr == '_' ) dot = ptr; /* remember last _ as if it were a dot */ if ( dot && (dot > src) && ((next - dot <= 4) || ((next - src > 8) && (dot - src > 3))) ) { if ( dot ) *dot = '.'; for ( ptr = src; (ptr < dot) && ((ptr - src) < 8); ptr++ ) *dst++ = *ptr; for ( ptr = dot; (ptr < next) && ((ptr - dot) < 4); ptr++ ) *dst++ = *ptr; } else { if ( dot && (next - src == 1) ) *dot = '.'; /* special case: "." as a path component */ for ( ptr = src; (ptr < next) && ((ptr - src) < 8); ptr++ ) *dst++ = *ptr; } *dst++ = *next; /* either '/' or 0 */ if ( *next ) { src = next + 1; if ( *src == 0 ) /* handle trailing '/' on dirs ! */ *dst = 0; } else break; } for ( src = start; *src != 0; ++src ) if ( (strchr(invalid, *src) != NULL) || ((*src == ' ') && !sflag) ) /* allow spaces if user wants */ *src = '_';}int IsFileNameValid(char *name){ HFILE hf;#ifdef __32BIT__ ULONG uAction;#else USHORT uAction;#endif switch( DosOpen(name, &hf, &uAction, 0, 0, FILE_OPEN, OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0) ) { case ERROR_INVALID_NAME: case ERROR_FILENAME_EXCED_RANGE: return FALSE; case NO_ERROR: DosClose(hf); default: return TRUE; }}typedef struct{ ULONG cbList; /* length of value + 22 */#ifdef __32BIT__ ULONG oNext;#endif BYTE fEA; /* 0 */ BYTE cbName; /* length of ".LONGNAME" = 9 */ USHORT cbValue; /* length of value + 4 */ BYTE szName[10]; /* ".LONGNAME" */ USHORT eaType; /* 0xFFFD for length-preceded ASCII */ USHORT eaSize; /* length of value */ BYTE szValue[CCHMAXPATH];}FEALST;int SetLongNameEA(char *name, char *longname){ EAOP eaop; FEALST fealst;#ifndef __32BIT__ if ( _osmode == DOS_MODE ) return 0;#endif eaop.fpFEAList = (PFEALIST) &fealst; eaop.fpGEAList = NULL; eaop.oError = 0; strcpy(fealst.szName, ".LONGNAME"); strcpy(fealst.szValue, longname); fealst.cbList = sizeof(fealst) - CCHMAXPATH + strlen(fealst.szValue); fealst.cbName = (BYTE) strlen(fealst.szName); fealst.cbValue = sizeof(USHORT) * 2 + strlen(fealst.szValue);#ifdef __32BIT__ fealst.oNext = 0;#endif fealst.fEA = 0; fealst.eaType = 0xFFFD; fealst.eaSize = strlen(fealst.szValue); return DosSetPathInfo(name, FIL_QUERYEASIZE, (PBYTE) &eaop, sizeof(eaop), 0#ifndef __32BIT__ , 0#endif );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -