C标准库源代码

源代码在线查看: rename.c

软件大小: 1707 K
上传用户: yl810406
关键词: 标准库 源代码
下载地址: 免注册下载 普通下载 VIP

相关代码

				/***
				*rename.c - rename file
				*
				*       Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
				*
				*Purpose:
				*       Defines rename() - rename a file
				*
				*******************************************************************************/
				
				#ifndef _MAC
				
				#include 
				#include 
				#include 
				#include 
				#include 
				
				/***
				*int rename(oldname, newname) - rename a file
				*
				*Purpose:
				*       Renames a file to a new name -- no file with new name must
				*       currently exist.
				*
				*Entry:
				*       _TSCHAR *oldname -      name of file to rename
				*       _TSCHAR *newname -      new name for file
				*
				*Exit:
				*       returns 0 if successful
				*       returns not 0 and sets errno if not successful
				*
				*Exceptions:
				*
				*******************************************************************************/
				
				int __cdecl _trename (
				        const _TSCHAR *oldname,
				        const _TSCHAR *newname
				        )
				{
				        ULONG dosretval;
				
				        /* ask OS to move file */
				
				        if (!MoveFile((LPTSTR)oldname, (LPTSTR)newname))
				            dosretval = GetLastError();
				        else
				            dosretval = 0;
				
				        if (dosretval) {
				            /* error occured -- map error code and return */
				            _dosmaperr(dosretval);
				            return -1;
				        }
				
				        return 0;
				}
				
				#else  /* _MAC */
				
				
				#include 
				#include 
				#include 
				#include 
				#include 
				#include 
				#include 
				#include 
				#include 
				#include 
				
				/***
				*int rename(oldname, newname) - rename a file
				*
				*Purpose:
				*       Renames a file to a new name -- no file with new name must
				*       currently exist.
				*
				*Entry:
				*       char *oldname -         name of file to rename
				*       char *newname -         new name for file
				*
				*Exit:
				*       returns 0 if successful
				*       returns not 0 and sets errno if not successful
				*
				*Exceptions:
				*
				*******************************************************************************/
				void __getdirandname(char *szdir, char *szname, const char *szpath);
				int __srename ( const char *oldname, const char *newname);
				int __accesspath (const char *dirname, const char *filename);
				
				int __cdecl rename (
				        const char *oldname,
				        const char *newname
				        )
				{
				        /* ask OS to move file */
				        HParamBlockRec hparamBlock;
				        char szOldName[32];       //old file name
				        char szOldDir[256];       //old dir name
				        char szNewName[32];       //new file name
				        char szNewDir[256];       //new dir name
				        char st[256];             //temp array for p-c string convertion
				        char st2[256];            //temp array for p-c string conversion
				        char szT[9];              //temp file name
				        OSErr osErr;
				        CMovePBRec cmovePB;
				        int fTemp = 0;
				        char *pch;
				        char *pchOld;
				
				        pchOld = strrchr(oldname, ':');
				        if ( (pchOld!= NULL) && (*(pchOld+1) == '\0') &&
				             (strchr(oldname, ':') == strrchr(oldname, ':')) )
				        {
				            /* rename a volume*/
				            pch = strrchr(newname, ':');
				            if (pch != NULL && *(pch+1) != '\0')
				            {
				                /* not rename to another volume name*/
				                errno = EINVAL;
				                return -1;
				            }
				            else if (pch != NULL && *(pch+1) == '\0')
				            {
				                osErr = __srename(oldname, newname);
				                if (osErr)
				                {
				                    _dosmaperr(osErr);
				                    return -1;
				                }
				                    return 0;
				            }
				            else if (pch == NULL)
				            {
				                strcpy(szNewName, newname);
				                strcat(szNewName, ":");
				                osErr = __srename(oldname, szNewName);
				                if (osErr)
				                {
				                    _dosmaperr(osErr);
				                    return -1;
				                }
				                return 0;
				            }
				        }
				
				        /*Separate file name and directory*/
				        __getdirandname(szOldDir, szOldName, oldname);
				        __getdirandname(szNewDir, szNewName, newname);
				        if (strcmp(szNewName, "")==0)
				        {
				            errno = EINVAL;
				            return -1;
				        }
				
				        /*if same dir*/
				        if (strcmp(szNewDir, szOldDir)==0 )
				        {
				            osErr = __srename(oldname, newname);
				            if (osErr)
				            {
				                /* error occured -- map error code and return */
				                _dosmaperr(osErr);
				                return -1;
				            }
				            return 0;
				        }
				
				        /*if new directory didn't supplied, getcwd*/
				        if (!*szNewDir)
				        {
				            _getcwd(szNewDir, 255);
				        }
				
				
				        /*if same name*/
				        if (strcmp(szNewName, szOldName)==0 )
				        {
				            /*just move*/
				            strcpy(st, oldname);
				            strcpy(st2, szNewDir);
				            cmovePB.ioNamePtr = _c2pstr(st);
				            cmovePB.ioVRefNum = 0;
				            cmovePB.ioNewName =_c2pstr(st2);
				            cmovePB.ioNewDirID = 0;
				            cmovePB.ioDirID = 0;
				            osErr = PBCatMoveSync(&cmovePB);
				            if (osErr)
				            {
				                /* error occured -- map error code and return */
				                if (osErr == nsvErr || osErr == bdNamErr)
				                {
				                    errno = EXDEV;
				                    _macerrno = osErr;
				                }
				                else
				                    _dosmaperr(osErr);
				                    return -1;
				            }
				                return 0;
				        }
				
				        osErr = __accesspath(szOldDir, szNewName);
				        if (osErr != fnfErr)
				        {
				            /* rename the file to a temp name */
				            strcpy(st, szOldDir);
				            strcpy(szT, "fnXXXXXX");
				            if (_mktemp(szT)!=NULL)
				            {
				                strcat(st, szT);
				                fTemp = 1;
				            }
				        }
				        else
				        {
				            *st='\0';
				            if (*szOldDir)
				            {
				                strcpy(st, szOldDir);
				            }
				            strcat(st, szNewName);
				        }
				        osErr = __srename(oldname, st);
				        if (osErr)
				        {
				            _dosmaperr(osErr);
				            return -1;
				        }
				
				        strcpy(st2, szNewDir);
				        /* move renamed file to new dir */
				        cmovePB.ioNamePtr = _c2pstr(st);
				        cmovePB.ioVRefNum = 0;
				        cmovePB.ioNewName =_c2pstr(st2);
				        cmovePB.ioNewDirID = 0;
				        cmovePB.ioDirID = 0;
				        osErr = PBCatMoveSync(&cmovePB);
				        if (osErr) {
				            /* error occured -- rename oldname back */
				            strcpy(st2, oldname);
				            hparamBlock.ioParam.ioNamePtr = st;
				            hparamBlock.ioParam.ioVRefNum = 0;
				            hparamBlock.ioParam.ioMisc = _c2pstr(st2);
				            hparamBlock.fileParam.ioDirID = 0;
				            PBHRenameSync(&hparamBlock);
				            if (osErr == nsvErr || osErr == bdNamErr)
				            {
				                errno=EXDEV;
				                _macerrno = osErr;
				            }
				            else
				                _dosmaperr(osErr);
				                return -1;
				        }
				
				        /* rename it to the new name in new dir*/
				        if (fTemp)
				        {
				            strcpy(st, szNewDir);
				            strcat(st, szT);
				            osErr = __srename(st, newname);
				            if (osErr)
				            {
				                _dosmaperr(osErr);
				                remove(st);
				                return -1;
				            }
				        }
				        return 0;
				}
				
				
				
				void __getdirandname (
				        char *szdir,
				        char *szname,
				        const char *szpath
				        )
				{
				        char *pch;
				
				        pch = strrchr(szpath, ':');
				        if (pch)
				        {
				            strcpy(szname, pch+1);
				            strncpy(szdir, szpath, (pch - szpath)+1);
				            szdir[(pch-szpath)+1]='\0';
				        }
				        else //no ':'
				        {
				            strcpy(szname, szpath);
				            *szdir = '\0';
				        }
				}
				
				int __srename (
				        const char *oldname,
				        const char *newname
				        )
				{
				        /* ask OS to move file */
				        HParamBlockRec hparamBlock;
				        char stOld[256];
				        char stNew[256];
				        OSErr osErr;
				
				        strcpy(stOld, oldname);
				        strcpy(stNew, newname);
				        hparamBlock.ioParam.ioNamePtr = _c2pstr(stOld);
				        hparamBlock.ioParam.ioVRefNum = 0;
				        hparamBlock.ioParam.ioMisc = _c2pstr(stNew);
				        hparamBlock.fileParam.ioDirID = 0;
				        osErr = PBHRenameSync(&hparamBlock);
				        return osErr;
				}
				
				int __accesspath (
				        const char *dirname,
				        const char *filename
				        )
				{
				        CInfoPBRec cinfoPB;
				        OSErr osErr;
				        char szBuf[256];
				
				        szBuf[0]='\0';
				        if (*dirname)
				        {
				            strcpy(szBuf, dirname);
				        }
				        strcat(szBuf, filename);
				        cinfoPB.hFileInfo.ioNamePtr = _c2pstr(szBuf);
				        cinfoPB.hFileInfo.ioFDirIndex = 0;
				        cinfoPB.hFileInfo.ioVRefNum = 0;
				        cinfoPB.hFileInfo.ioDirID = 0;
				        osErr = PBGetCatInfoSync(&cinfoPB);
				        if (osErr)
				        {
				            return osErr;
				        }
				        else
				        {
				            /* file or dir ? */
				            if (cinfoPB.hFileInfo.ioFlAttrib & 0x10)
				            { /*dir*/
				                return 1;
				            }
				            else
				            {
				                return 0;
				            }
				        }
				}
				
				#endif  /* _MAC */
							

相关资源