NT4/private/windows/diamond/fileutil.h
2020-09-30 17:12:29 +02:00

449 lines
14 KiB
C

/*** fileutil.h - Utility routines for dealing with files
*
* Microsoft Confidential
* Copyright (C) Microsoft Corporation 1994
* All Rights Reserved.
*
* Author:
* Benjamin W. Slivka
*
* History:
* 20-Feb-1994 bens Initial version (code from diamond.c)
* 23-Feb-1994 bens Added createTempFile()
* 23-Feb-1994 bens Added richer tempfile routines
* 23-Mar-1994 bens Added Win32<->MS-DOS file attribute mapping
* 03-Jun-1994 bens VER.DLL support
* 07-Jun-1994 bens Move VER.DLL stuff to filever.c
* 14-Dec-1994 bens Update list of exported functions
*
* Exported Functions:
* CopyOneFile - Make a faithful copy of a file
* getFileSize - Get size of a file
* GetFileTimeAndAttr - Get date, time, and attributes from a file
* SetFileTimeAndAttr - Set date, time, and attributes of a file
* appendPathSeparator - Append a path separator only if necessary
* catDirAndFile - Concatenate a possibly empty dir and file name
* ensureDirectory - Ensure directory exists (creating as needed)
* ensureFile - Ensure a file can be created
* getJustFileNameAndExt - Get last component in filespec
* Attr32FromAttrFAT - Convert FAT file attributes to Win32 form
* AttrFATFromAttr32 - Convert Win32 file attributes to FAT form
* IsWildMatch - Test filespec against wild card specification
* IsPathRemovable - See if path refers to a removable media drive
* TmpCreate - Create a temporary file
* TmpGetStream - Get FILE* from HTEMPFILE, to perform I/O
* TmpGetDescription - Get description of temporary file
* TmpGetFileName - Get filename of temporary file
* TmpClose - Close temporary file, but keep tempfile handle
* TmpOpen - Open the stream for a temporary file
* TmpDestroy - Delete tempfil and destroy handle
*/
#ifndef INCLUDED_FILEUTIL
#define INCLUDED_FILEUTIL 1
#include "error.h"
#include <stdio.h>
typedef void *HTEMPFILE;
//** Maximum path length
#define cbFILE_NAME_MAX 256 // Maximum filespec length
#define pszALL_FILES "*.*" // Match all files
//** File name characters & wild card characters
#define chPATH_SEP1 '\\' // Character to separate file path components
#define chPATH_SEP2 '/' // Character to separate file path components
// Ex: one<\>two<\>foo.dat
#define chNAME_EXT_SEP '.' // Character that separates file name and ext
// Ex: one\two\foo<.>dat
#define chDRIVE_SEP ':' // Character that separates drive letter
// Ex: a<:>\foo.dat
#define chWILD_RUN '*' // Wild card character that matches a run
#define chWILD_CHAR '?' // Wild card character that matches single char
/*** FILETIMEATTR - Lowest common denominator file date/time/attributes
*
* The format of these match the MS-DOS FAT file system.
*/
typedef struct {
USHORT date; // file date
USHORT time; // file time
USHORT attr; // file attibutes
} FILETIMEATTR; /* fta */
typedef FILETIMEATTR *PFILETIMEATTR; /* pfta */
/*** PFNOVERRIDEFILEPROPERTIES - Function type for CopyOneFile override
*** FNOVERRIDEFILEPROPERTIES - macro to help define CopyOneFile override
*
* Entry:
* pfta - File date/time/attr structure
* pv - Client context pointer
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE, pfta structure may have been modified.
*
* Exit-Failure:
* Returns FALSE,
* ERROR structure filled in with details of error.
*/
typedef BOOL (*PFNOVERRIDEFILEPROPERTIES)(PFILETIMEATTR pfta, /* pfnofp */
void *pv,
PERROR perr);
#define FNOVERRIDEFILEPROPERTIES(fn) BOOL fn(PFILETIMEATTR pfta, \
void *pv, \
PERROR perr)
/*** CopyOneFile - Make a faithful copy of a file
*
* Entry:
* pszDst - Name of destination file
* pszSrc - Name of source file
* fCopy - TRUE => copy file; FALSE => open src, call pfnofp to
* merge file date/time/attr values, but skip COPY!
* cbBuffer - Amount of temporary buffer space to use for copying
* pfnofp - Function to override file properties; called with the
* file date/time/attributes for pszSrc to permit client
* to override these values. Pass NULL if no override
* desired.
* pv - Client context pointer
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; file copied successfully
*
* Exit-Failure:
* Returns FALSE; perr filled in
*/
BOOL CopyOneFile(char *pszDst,
char *pszSrc,
BOOL fCopy,
UINT cbBuffer,
PFNOVERRIDEFILEPROPERTIES pfnofp,
void *pv,
PERROR perr);
/*** getFileSize - Get size of a file
*
* Entry:
* pszFile - Filespec
* perr - ERROR structure
*
* Exit-Success:
* Returns size of file.
*
* Exit-Failure:
* Returns -1; perr filled in with error.
*/
long getFileSize(char *pszFile, PERROR perr);
/*** GetFileTimeAndAttr - Get date, time, and attributes from a file
*
* Entry:
* pfta - Structure to receive date, time, and attributes
* pszFile - Name of file to inspect
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; pfta filled in
*
* Exit-Failure:
* Returns FALSE; perr filled in
*/
BOOL GetFileTimeAndAttr(PFILETIMEATTR pfta, char *pszFile, PERROR perr);
/*** SetFileTimeAndAttr - Set date, time, and attributes of a file
*
* Entry:
* pszFile - Name of file to modify
* pfta - Structure to receive date, time, and attributes
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; pfta filled in
*
* Exit-Failure:
* Returns FALSE; perr filled in
*/
BOOL SetFileTimeAndAttr(char *pszFile, PFILETIMEATTR pfta, PERROR perr);
/*** appendPathSeparator - Append a path separator only if necessary
*
* Entry:
* pszPathEnd - Pointer to last character in a path string
* (will be NULL byte if path is empty).
* Buffer is assumed to have room for one more character!
*
* Exit:
* Returns 1 if a path separator was appended
* Returns 0 if no path separator was appended:
* 1) Path was empty -or-
* 2) Last character of path was '\', '/', or ':'
*/
int appendPathSeparator(char *pszPathEnd);
/*** catDirAndFile - Concatenate a possibly empty dir and file name
*
* Note: pszFile/pszFileDef can actually have path characters, and do not
* need to be file names. Essentially, this function just concatenates
* two strings together, ensuring a path separator is between them!
*
* Entry:
* pszResult - Buffer to receive concatentation
* cbResult - Size of pszResult
* pszDir - Possibly empty directory string
* pszFile - Possibly empty file string
* pszFileDef - Path string to use if pszFile is empty; if NULL, then
* pszFile must NOT be empty. If not NULL, and pszFile
* is empty, then pszFileDef is examined, any path
* prefixes are removed, and the base filename.ext
* is used.
* perr - ERROR structure to fill in
*
* Exit-Success:
* Returns TRUE; pszResult filled in.
*
* Exit-Failure:
* Returns FALSE; perr filled in with error.
*/
BOOL catDirAndFile(char * pszResult,
int cbResult,
char * pszDir,
char * pszFile,
char * pszFileDef,
PERROR perr);
/*** ensureDirectory - Ensure directory exists (creating as needed)
*
* Entry:
* pszPath - File spec with directory names to ensure exist
* fHasFileName - TRUE if pszPath has file name at end. In this case
* the last component of pszPath is ignored.
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; directory exists
*
* Exit-Failure:
* Returns FALSE; could not create directory, perr filled in with error.
*/
BOOL ensureDirectory(char *pszPath, BOOL fHasFileName, PERROR perr);
/*** ensureFile - Ensure a file can be created
*
* Creates any directories that are needed, then creates file and deletes it.
*
* Entry:
* pszPath - File spec with directory names to ensure exist
* pszDesc - Description of type of file (for error message).
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; file can be created
*
* Exit-Failure:
* Returns FALSE; could not create file, perr filled in with error.
*/
BOOL ensureFile(char *pszFile, char *pszDesc, PERROR perr);
/*** getJustFileNameAndExt - Get last component in filespec
*
* Entry:
* pszPath - Filespec to parse
* perr - ERROR structure to fill in
*
* Exit-Success:
* Returns pointer into pszPath where last component starts
*
* Exit-Failure:
* Returns NULL; perr filled in with error.
*/
char *getJustFileNameAndExt(char *pszPath, PERROR perr);
/*** Attr32FromAttrFAT - Convert FAT file attributes to Win32 form
*
* Entry:
* attrMSDOS - MS-DOS (FAT file system) file attributes
*
* Exit:
* Returns equivalent attributes in Win32 format.
*/
DWORD Attr32FromAttrFAT(WORD attrMSDOS);
/*** AttrFATFromAttr32 - Convert Win32 file attributes to FAT form
*
* Entry:
* attrMSDOS - MS-DOS (FAT file system) file attributes
*
* Exit:
* Returns equivalent attributes in Win32 format.
*/
WORD AttrFATFromAttr32(DWORD attr32);
/*** IsWildMatch - Test filespec against wild card specification
*
* Entry:
* pszPath - Filespec to test; Must not have path characters -- use
* getJustFileNameAndExt() to get rid of them.
* pszWild - Pattern to test against (may have wild cards)
* perr - ERROR structure to fill in
*
* Exit-Success:
* Returns TRUE; pszPath matches pszWild
*
* Exit-Failure:
* Returns FALSE; no match; use ErrIsError(perr) to see if error
* occured.
*/
BOOL IsWildMatch(char *pszPath, char *pszWild, PERROR perr);
/*** IsPathRemovable - See if path refers to a removable media drive
*
* Entry:
* pszPath - Path to test
* pchDrive - Pointer to character to receive drive letter
*
* Exit-Success:
* Returns TRUE; path refers to removable media
*
* Exit-Failure:
* Returns FALSE; path is not removable
* occured.
*/
BOOL IsPathRemovable(char *pszPath, char *pchDrive);
/*** TmpCreate - Create a temporary file
*
* Entry:
* pszDesc - Description of temp file (for error reporting)
* pszPrefix - Filename prefix
* pszMode - Mode string passed to fopen ("wt", "wb", "rt", etc.)
* perr - ERROR structure
*
* Exit-Success:
* Returns non-null HTEMPFILE; temp file created and open
*
* Exit-Failure:
* Returns NULL; perr filled in
*/
HTEMPFILE TmpCreate(char *pszDesc, char *pszPrefix, char *pszMode, PERROR perr);
/*** TmpGetStream - Get FILE* from HTEMPFILE, to perform I/O
*
* Entry:
* htmp - Handle to temp file
* perr - ERROR structure
*
* Exit-Success:
* Returns non-null FILE*
*
* Exit-Failure:
* Returns NULL; If ErrIsError(perr) indicates no error, then the
* stream had simply been closed with TmpClose(). Else, perr has
* error details.
*/
FILE *TmpGetStream(HTEMPFILE htmp, PERROR perr);
/*** TmpGetDescription - Get description of temporary file
*
* Entry:
* htmp - Handle to temp file
* perr - ERROR structure
*
* Exit-Success:
* Returns non-null pointer to description
*
* Exit-Failure:
* Returns NULL; perr filled in
*/
char *TmpGetDescription(HTEMPFILE htmp, PERROR perr);
/*** TmpGetFileName - Get filename of temporary file
*
* Entry:
* htmp - Handle to temp file
* perr - ERROR structure
*
* Exit-Success:
* Returns non-null pointer to temp filename
*
* Exit-Failure:
* Returns NULL; perr filled in
*/
char *TmpGetFileName(HTEMPFILE htmp, PERROR perr);
/*** TmpClose - Close a temporary file stream, but keep tempfile handle
*
* Entry:
* htmp - Handle to temp file;
* NOTE: This call is a NOP if the stream is already closed.
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; stream closed
*
* Exit-Failure:
* Returns FALSE; perr filled in
*/
BOOL TmpClose(HTEMPFILE htmp, PERROR perr);
/*** TmpOpen - Open the stream for a temporary file
*
* Entry:
* htmp - Handle to temp file
* pszMode - Mode string passed to fopen ("wt", "wb", "rt", etc.)
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; stream opened
*
* Exit-Failure:
* Returns NULL; perr filled in
*/
BOOL TmpOpen(HTEMPFILE htmp, char *pszMode, PERROR perr);
/*** TmpDestroy - Delete tempfil and destroy handle
*
* Entry:
* htmp - Handle to temp file
* perr - ERROR structure
*
* Exit-Success:
* Returns TRUE; tempfile destroyed
*
* Exit-Failure:
* Returns NULL; perr filled in
*/
BOOL TmpDestroy(HTEMPFILE htmp, PERROR perr);
#endif // !INCLUDED_FILEUTIL