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

📄 macstuff.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
📖 第 1 页 / 共 4 页
字号:
        {            *theDirID = pb.hFileInfo.ioFlParID;        }    }    return ( error );}/*****************************************************************************/pascal  OSErr GetCatInfoNoName(short vRefNum,                               long dirID,                               ConstStr255Param name,                               CInfoPBPtr pb){    Str31 tempName;    OSErr error;    /* Protection against File Sharing problem */    if ( (name == NULL) || (name[0] == 0) )    {        tempName[0] = 0;        pb->dirInfo.ioNamePtr = tempName;        pb->dirInfo.ioFDirIndex = -1;   /* use ioDirID */    }    else    {        pb->dirInfo.ioNamePtr = (StringPtr)name;        pb->dirInfo.ioFDirIndex = 0;    /* use ioNamePtr and ioDirID */    }    pb->dirInfo.ioVRefNum = vRefNum;    pb->dirInfo.ioDrDirID = dirID;    error = PBGetCatInfoSync(pb);    pb->dirInfo.ioNamePtr = NULL;    return ( error );}/*****************************************************************************/pascal  OSErr   GetObjectLocation(short vRefNum,                                  long dirID,                                  ConstStr255Param pathname,                                  short *realVRefNum,                                  long *realParID,                                  Str255 realName,                                  Boolean *isDirectory){    OSErr error;    CInfoPBRec pb;    Str255 tempPathname;    /* clear results */    *realVRefNum = 0;    *realParID = 0;    realName[0] = 0;    /*    **  Get the real vRefNum    */    error = DetermineVRefNum(pathname, vRefNum, realVRefNum);    if ( error == noErr )    {        /*        **  Determine if the object already exists and if so,        **  get the real parent directory ID if it's a file        */        /* Protection against File Sharing problem */        if ( (pathname == NULL) || (pathname[0] == 0) )        {            tempPathname[0] = 0;            pb.hFileInfo.ioNamePtr = tempPathname;            pb.hFileInfo.ioFDirIndex = -1;  /* use ioDirID */        }        else        {            pb.hFileInfo.ioNamePtr = (StringPtr)pathname;            pb.hFileInfo.ioFDirIndex = 0;   /* use ioNamePtr and ioDirID */        }        pb.hFileInfo.ioVRefNum = vRefNum;        pb.hFileInfo.ioDirID = dirID;        error = PBGetCatInfoSync(&pb);        if ( error == noErr )        {            /*            **  The file system object is present and we have the file's            **  real parID            */            /*  Is it a directory or a file? */            *isDirectory = (pb.hFileInfo.ioFlAttrib & ioDirMask) != 0;            if ( *isDirectory )            {                /*                **  It's a directory, get its name and parent dirID, and then                **  we're done                */                pb.dirInfo.ioNamePtr = realName;                pb.dirInfo.ioVRefNum = *realVRefNum;                /* pb.dirInfo.ioDrDirID already contains the dirID of the                   directory object */                pb.dirInfo.ioFDirIndex = -1;    /* get information about ioDirID */                error = PBGetCatInfoSync(&pb);                /* get the parent ID here, because the file system can return the */                /* wrong parent ID from the last call. */                *realParID = pb.dirInfo.ioDrParID;            }            else            {                /*                **  It's a file - use the parent directory ID from the last call                **  to GetCatInfoparse, get the file name, and then we're done                */                *realParID = pb.hFileInfo.ioFlParID;                error = GetFilenameFromPathname(pathname, realName);            }        }        else if ( error == fnfErr )        {            /*            **  The file system object is not present - see if its parent is present            */            /*            **  Parse to get the object name from end of pathname            */            error = GetFilenameFromPathname(pathname, realName);            /* if we can't get the object name from the end, we can't continue */            if ( error == noErr )            {                /*                **  What we want now is the pathname minus the object name                **  for example:                **  if pathname is 'vol:dir:file' tempPathname becomes 'vol:dir:'                **  if pathname is 'vol:dir:file:' tempPathname becomes 'vol:dir:'                **  if pathname is ':dir:file' tempPathname becomes ':dir:'                **  if pathname is ':dir:file:' tempPathname becomes ':dir:'                **  if pathname is ':file' tempPathname becomes ':'                **  if pathname is 'file or file:' tempPathname becomes ''                */                /* get a copy of the pathname */                BlockMoveData(pathname, tempPathname, pathname[0] + 1);                /* remove the object name */                tempPathname[0] -= realName[0];                /* and the trailing colon (if any) */                if ( pathname[pathname[0]] == ':' )                {                    --tempPathname[0];                }                /* OK, now get the parent's directory ID */                /* Protection against File Sharing problem */                pb.hFileInfo.ioNamePtr = (StringPtr)tempPathname;                if ( tempPathname[0] != 0 )                {                    pb.hFileInfo.ioFDirIndex = 0;   /* use ioNamePtr and ioDirID */                }                else                {                    pb.hFileInfo.ioFDirIndex = -1;  /* use ioDirID */                }                pb.hFileInfo.ioVRefNum = vRefNum;                pb.hFileInfo.ioDirID = dirID;                error = PBGetCatInfoSync(&pb);                *realParID = pb.dirInfo.ioDrDirID;                *isDirectory = false;   /* we don't know what the object is                                           really going to be */            }            if ( error != noErr )            {                error = dirNFErr;   /* couldn't find parent directory */            }            else            {                error = fnfErr; /* we found the parent, but not the file */            }        }    }    return ( error );}/*****************************************************************************/pascal  OSErr   DetermineVRefNum(ConstStr255Param pathname,                                 short vRefNum,                                 short *realVRefNum){    HParamBlockRec pb;    OSErr error;    error = GetVolumeInfoNoName(pathname,vRefNum, &pb);    if ( error == noErr )    {        *realVRefNum = pb.volumeParam.ioVRefNum;    }    return ( error );}/*****************************************************************************/pascal  OSErr   GetFilenameFromPathname(ConstStr255Param pathname,                                        Str255 filename){    short   index;    short   nameEnd;    OSErr   error;    /* default to no filename */    filename[0] = 0;    /* check for no pathname */    if ( pathname != NULL )    {        /* get string length */        index = pathname[0];        /* check for empty string */        if ( index != 0 )        {            /* skip over last trailing colon (if any) */            if ( pathname[index] == ':' )            {                --index;            }            /* save the end of the string */            nameEnd = index;            /* if pathname ends with multiple colons, then this pathname refers */            /* to a directory, not a file */            if ( pathname[index] != ':' )            {                /* parse backwards until we find a colon or hit the beginning                   of the pathname */                while ( (index != 0) && (pathname[index] != ':') )                {                    --index;                }                /* if we parsed to the beginning of the pathname and the                   pathname ended */                /* with a colon, then pathname is a full pathname to a volume,                   not a file */                if ( (index != 0) || (pathname[pathname[0]] != ':') )                {                    /* get the filename and return noErr */                    filename[0] = (char)(nameEnd - index);                    BlockMoveData(&pathname[index+1], &filename[1], nameEnd - index);                    error = noErr;                }                else                {                    /* pathname to a volume, not a file */                    error = notAFileErr;                }            }            else            {                /* directory, not a file */                error = notAFileErr;            }        }        else        {            /* empty string isn't a file */            error = notAFileErr;        }    }    else    {        /* NULL pathname isn't a file */        error = notAFileErr;    }    return ( error );}/*****************************************************************************//***  GetVolumeInfoNoName uses pathname and vRefNum to call PBHGetVInfoSync**  in cases where the returned volume name is not needed by the caller.**  The pathname and vRefNum parameters are not touched, and the pb**  parameter is initialized by PBHGetVInfoSync except that ioNamePtr in**  the parameter block is always returned as NULL (since it might point**  to the local tempPathname).****  I noticed using this code in several places, so here it is once.**  This reduces the code size of MoreFiles.*/pascal  OSErr   GetVolumeInfoNoName(ConstStr255Param pathname,                                    short vRefNum,                                    HParmBlkPtr pb){    Str255 tempPathname;    OSErr error;    /* Make sure pb parameter is not NULL */    if ( pb != NULL )    {        pb->volumeParam.ioVRefNum = vRefNum;        if ( pathname == NULL )        {            pb->volumeParam.ioNamePtr = NULL;            pb->volumeParam.ioVolIndex = 0;     /* use ioVRefNum only */        }        else        {                                   /* make a copy of the string and */            BlockMoveData(pathname, tempPathname, pathname[0] + 1);                                    /* use the copy so original isn't trashed */            pb->volumeParam.ioNamePtr = (StringPtr)tempPathname;                                       /* use ioNamePtr/ioVRefNum combination */            pb->volumeParam.ioVolIndex = -1;        }        error = PBHGetVInfoSync(pb);        pb->volumeParam.ioNamePtr = NULL;   /* ioNamePtr may point to local                                            tempPathname, so don't return it */    }    else    {        error = paramErr;    }    return ( error );}/*****************************************************************************/pascal  OSErr   FSpGetFullPath(const FSSpec *spec,                               short *fullPathLength,                               Handle *fullPath){    OSErr       result;    OSErr       realResult;    FSSpec      tempSpec;    CInfoPBRec  pb;    *fullPathLength = 0;    *fullPath = NULL;    /* Default to noErr */    realResult = noErr;    /* Make a copy of the input FSSpec that can be modified */    BlockMoveData(spec, &tempSpec, sizeof(FSSpec));    if ( tempSpec.parID == fsRtParID )    {        /* The object is a volume */        /* Add a colon to make it a full pathname */        ++tempSpec.name[0];        tempSpec.name[tempSpec.name[0]] = ':';        /* We're done */        result = PtrToHand(&tempSpec.name[1], fullPath, tempSpec.name[0]);    }    else    {        /* The object isn't a volume */        /* Is the object a file or a directory? */        pb.dirInfo.ioNamePtr = tempSpec.name;        pb.dirInfo.ioVRefNum = tempSpec.vRefNum;        pb.dirInfo.ioDrDirID = tempSpec.parID;        pb.dirInfo.ioFDirIndex = 0;        result = PBGetCatInfoSync(&pb);        /* Allow file/directory name at end of path to not exist. */        realResult = result;        if ( (result == noErr) || (result == fnfErr) )        {            /* if the object is a directory, append a colon so full pathname               ends with colon */            if ( (result == noErr) && (pb.hFileInfo.ioFlAttrib & ioDirMask) != 0 )            {                ++tempSpec.name[0];                tempSpec.name[tempSpec.name[0]] = ':';            }            /* Put the object name in first */            result = PtrToHand(&tempSpec.name[1], fullPath, tempSpec.name[0]);            if ( result == noErr )            {                /* Get the ancestor directory names */

⌨️ 快捷键说明

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