pdirect.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:17k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * pdirect.h
  3.  *
  4.  * File system directory class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: pdirect.h,v $
  30.  * Revision 1.32  2000/06/26 11:17:19  robertj
  31.  * Nucleus++ port (incomplete).
  32.  *
  33.  * Revision 1.31  2000/04/03 18:41:27  robertj
  34.  * Fixed BeOS compatibility problem with openlog() function.
  35.  *
  36.  * Revision 1.30  1999/03/09 02:59:50  robertj
  37.  * Changed comments to doc++ compatible documentation.
  38.  *
  39.  * Revision 1.29  1999/02/16 08:11:09  robertj
  40.  * MSVC 6.0 compatibility changes.
  41.  *
  42.  * Revision 1.28  1998/09/23 06:21:06  robertj
  43.  * Added open source copyright license.
  44.  *
  45.  * Revision 1.27  1998/03/05 12:44:34  robertj
  46.  * Added cluster size.
  47.  *
  48.  * Revision 1.26  1997/03/31 11:34:00  robertj
  49.  * Fixed default permissions for directories , different from that for files.
  50.  *
  51.  * Revision 1.25  1997/01/12 04:22:21  robertj
  52.  * Added function to get disk size and free space.
  53.  *
  54.  * Revision 1.24  1995/12/23 03:45:31  robertj
  55.  * Added constructor for C string literals.
  56.  *
  57.  * Revision 1.23  1995/11/09 12:17:23  robertj
  58.  * Added platform independent base type access classes.
  59.  *
  60.  * Revision 1.22  1995/10/14 15:02:22  robertj
  61.  * Added function to get parent directory.
  62.  *
  63.  * Revision 1.21  1995/06/17 11:12:52  robertj
  64.  * Documentation update.
  65.  *
  66.  * Revision 1.20  1995/03/14 12:42:00  robertj
  67.  * Updated documentation to use HTML codes.
  68.  *
  69.  * Revision 1.19  1995/03/12  04:42:48  robertj
  70.  * Updated documentation.
  71.  * Changed return type of functions to the correct case string.
  72.  *
  73.  * Revision 1.18  1995/02/22  10:50:33  robertj
  74.  * Changes required for compiling release (optimised) version.
  75.  *
  76.  * Revision 1.17  1995/01/06  10:42:25  robertj
  77.  * Moved identifiers into different scope.
  78.  * Changed file size to 64 bit integer.
  79.  * Documentation
  80.  *
  81.  * Revision 1.16  1994/10/24  00:07:03  robertj
  82.  * Changed PFilePath and PDirectory so descends from either PString or
  83.  *     PCaselessString depending on the platform.
  84.  *
  85.  * Revision 1.15  1994/10/23  04:49:25  robertj
  86.  * Chnaged PDirectory to descend of PString.
  87.  * Added PDirectory Exists() function.
  88.  *
  89.  * Revision 1.14  1994/08/23  11:32:52  robertj
  90.  * Oops
  91.  *
  92.  * Revision 1.13  1994/08/22  00:46:48  robertj
  93.  * Added pragma fro GNU C++ compiler.
  94.  *
  95.  * Revision 1.12  1994/06/25  11:55:15  robertj
  96.  * Unix version synchronisation.
  97.  *
  98.  * Revision 1.11  1994/04/20  12:17:44  robertj
  99.  * Split name into PFilePath
  100.  *
  101.  * Revision 1.10  1994/04/11  14:16:27  robertj
  102.  * Added function for determining if character is a valid directory separator.
  103.  *
  104.  * Revision 1.9  1994/04/01  14:14:57  robertj
  105.  * Put platform independent file permissions and type codes back.
  106.  *
  107.  * Revision 1.7  1994/01/13  03:17:55  robertj
  108.  * Added functions to get the name of the volume the directory is contained in
  109.  *    and a function to determine if the directory is a root directory of the
  110.  *    volume (ie is does not have a parent directory).
  111.  *
  112.  * Revision 1.6  1994/01/03  04:42:23  robertj
  113.  * Mass changes to common container classes and interactors etc etc etc.
  114.  *
  115.  * Revision 1.5  1993/12/31  06:45:38  robertj
  116.  * Made inlines optional for debugging purposes.
  117.  *
  118.  * Revision 1.4  1993/08/21  01:50:33  robertj
  119.  * Made Clone() function optional, default will assert if called.
  120.  *
  121.  * Revision 1.3  1993/07/14  12:49:16  robertj
  122.  * Fixed RCS keywords.
  123.  *
  124.  */
  125. #define _PDIRECTORY
  126. #ifdef __GNUC__
  127. #pragma interface
  128. #endif
  129. #ifdef Fifo
  130. #undef Fifo
  131. #endif
  132. ///////////////////////////////////////////////////////////////////////////////
  133. // File System
  134. /**Class containing the system information on a file path. Information can be
  135.    obtained on any directory entry event if it is not a "file" in the strictest
  136.    sense. Sub-directories, devices etc may also have information retrieved.
  137.  */
  138. class PFileInfo : public PObject
  139. {
  140.   PCLASSINFO(PFileInfo, PObject);
  141.   public:
  142.     /**All types that a particular file path may be. Not all platforms support
  143.        all of the file types. For example under DOS no file may be of the
  144.        type #SymbolicLink#.
  145.      */
  146.     enum FileTypes {
  147.       /// Ordinary disk file.
  148.       RegularFile = 1,        
  149.       /// File path is a symbolic link.
  150.       SymbolicLink = 2,       
  151.       /// File path is a sub-directory
  152.       SubDirectory = 4,       
  153.       /// File path is a character device name.
  154.       CharDevice = 8,         
  155.       /// File path is a block device name.
  156.       BlockDevice = 16,       
  157.       /// File path is a fifo (pipe) device.
  158.       Fifo = 32,              
  159.       /// File path is a socket device.
  160.       SocketDevice = 64,      
  161.       /// File path is of an unknown type.
  162.       UnknownFileType = 256,  
  163.       /// Mask for all file types.
  164.       AllFiles = 0x1ff        
  165.     };
  166.     /// File type for this file. Only one bit is set at a time here.
  167.     FileTypes type;
  168.     /**Time of file creation of the file. Not all platforms support a separate
  169.        creation time in which case the last modified time is returned.
  170.      */
  171.     PTime created;
  172.     /// Time of last modifiaction of the file.
  173.     PTime modified;
  174.     /**Time of last access to the file. Not all platforms support a separate
  175.        access time in which case the last modified time is returned.
  176.      */
  177.     PTime accessed;
  178.     /**Size of the file in bytes. This is a quadword or 8 byte value to allow
  179.        for files greater than 4 gigabytes.
  180.      */
  181.     PUInt64 size;
  182.     /// File access permissions for the file.
  183.     enum Permissions {
  184.       /// File has world execute permission
  185.       WorldExecute = 1,   
  186.       /// File has world write permission
  187.       WorldWrite = 2,     
  188.       /// File has world read permission
  189.       WorldRead = 4,      
  190.       /// File has group execute permission
  191.       GroupExecute = 8,   
  192.       /// File has group write permission
  193.       GroupWrite = 16,    
  194.       /// File has group read permission
  195.       GroupRead = 32,     
  196.       /// File has owner execute permission
  197.       UserExecute = 64,   
  198.       /// File has owner write permission
  199.       UserWrite = 128,    
  200.       /// File has owner read permission
  201.       UserRead = 256,     
  202.       /// All possible permissions.
  203.       AllPermissions = 0x1ff,   
  204.       /// Owner read & write plus group and world read permissions.
  205.       DefaultPerms = UserRead|UserWrite|GroupRead|WorldRead,
  206.       /// Owner read & write & execute plus group and world read & exectute permissions.
  207.       DefaultDirPerms = DefaultPerms|UserExecute|GroupExecute|WorldExecute
  208.       
  209.     };
  210.     /**A bit mask of all the file acces permissions. See the
  211.        #Permissions enum# for the possible bit values.
  212.        
  213.        Not all platforms support all permissions.
  214.      */
  215.     int permissions;
  216.     /**File is a hidden file. What constitutes a hidden file is platform
  217.        dependent, for example under unix it is a file beginning with a '.'
  218.        character while under MS-DOS there is a file system attribute for it.
  219.      */
  220.     BOOL hidden;
  221. };
  222. /**Class to represent a directory in the operating system file system. A
  223.    directory is a special file that contains a list of file paths.
  224.    
  225.    The directory paths are highly platform dependent and a minimum number of
  226.    assumptions should be made.
  227.    
  228.    The PDirectory object is a string consisting of a possible volume name, and
  229.    a series directory names in the path from the volumes root to the directory
  230.    that the object represents. Each directory is separated by the platform
  231.    dependent separator character which is defined by the PDIR_SEPARATOR macro.
  232.    The path always has a trailing separator.
  233.    Some platforms allow more than one character to act as a directory separator
  234.    so when doing any processing the #IsSeparator()# function should be
  235.    used to determine if a character is a possible separator.
  236.    The directory may be opened to gain access to the list of files that it
  237.    contains. Note that the directory does {bf not} contain the "." and ".."
  238.    entries that some platforms support.
  239.    The ancestor class is dependent on the platform. For file systems that are
  240.    case sensitive, eg Unix, the ancestor is #PString#. For other
  241.    platforms, the ancestor class is #PCaselessString#.
  242.  */
  243. class PDirectory : public PFilePathString
  244. {
  245.   PCONTAINERINFO(PDirectory, PFilePathString);
  246.   public:
  247.   /**@name Construction */
  248.   //@{
  249.     /// Create a directory object of the current working directory
  250.     PDirectory();
  251.       
  252.     /**Create a directory object of the specified directory. The
  253.        #pathname# parameter may be a relative directory which is
  254.        made absolute by the creation of the #PDirectory# object.
  255.      */
  256.     PDirectory(
  257.       const char * cpathname      /// Directory path name for new object.
  258.     );
  259.     /**Create a directory object of the specified directory. The
  260.        #pathname# parameter may be a relative directory which is
  261.        made absolute by the creation of the #PDirectory# object.
  262.      */
  263.     PDirectory(
  264.       const PString & pathname    /// Directory path name for new object.
  265.     );
  266.   //@}
  267.   /**@name Access functions */
  268.   //@{
  269.     /**Get the directory for the parent to the current directory. If the
  270.        directory is already the root directory it returns the root directory
  271.        again.
  272.        @return
  273.        parent directory.
  274.      */
  275.     PDirectory GetParent() const;
  276.     /**Get the volume name that the directory is in.
  277.     
  278.        This is platform dependent, for example for MS-DOS it is the 11
  279.        character volume name for the drive, eg "DOS_DISK", and for Macintosh it
  280.        is the disks volume name eg "Untitled". For a unix platform it is the
  281.        device name for the file system eg "/dev/sda1".
  282.        @return
  283.        string for the directory volume.
  284.      */
  285.     PFilePathString GetVolume() const;
  286.     /**Determine if the directory is the root directory of a volume.
  287.     
  288.        @return
  289.        TRUE if the object is a root directory.
  290.      */
  291.     BOOL IsRoot() const;
  292.     /**Determine if the character #ch# is a directory path
  293.        separator.
  294.        @return
  295.        TRUE if may be used to separate directories in a path.
  296.      */
  297.     PINLINE static BOOL IsSeparator(
  298.       char ch    /// Character to check as being a separator.
  299.     );
  300.     /**Determine the total number of bytes and number of bytes free on the
  301.        volume that this directory is contained on.
  302.        Note that the free space will be the physical limit and if user quotas
  303.        are in force by the operating system, the use may not actually be able
  304.        to use all of these bytes.
  305.        @return
  306.        TRUE if the information could be determined.
  307.      */
  308.     BOOL GetVolumeSpace(
  309.       PInt64 & total,     /// Total number of bytes available on volume
  310.       PInt64 & free,      /// Number of bytes unused on the volume
  311.       DWORD & clusterSize /// "Quantisation factor" in bytes for files on volume
  312.     ) const;
  313.   //@}
  314.   /**@name File system functions */
  315.   //@{
  316.     /**Test for if the directory exists.
  317.        @return
  318.        TRUE if directory exists.
  319.      */
  320.     BOOL Exists() const;
  321.     /**Test for if the specified directory exists.
  322.        @return
  323.        TRUE if directory exists.
  324.      */
  325.     static BOOL Exists(
  326.       const PString & path   /// Directory file path.
  327.     );
  328.       
  329.     /**Change the current working directory to the objects location.
  330.        @return
  331.        TRUE if current working directory was changed.
  332.      */
  333.     BOOL Change() const;
  334.     /**Change the current working directory to that specified..
  335.        @return
  336.        TRUE if current working directory was changed.
  337.      */
  338.     static BOOL Change(
  339.       const PString & path   /// Directory file path.
  340.     );
  341.       
  342.     /**Create a new directory with the specified permissions.
  343.        @return
  344.        TRUE if directory created.
  345.      */
  346.     BOOL Create(
  347.       int perm = PFileInfo::DefaultDirPerms    // Permission on new directory.
  348.     ) const;
  349.     /**Create a new directory as specified with the specified permissions.
  350.        @return
  351.        TRUE if directory created.
  352.      */
  353.     static BOOL Create(
  354.       const PString & p,   /// Directory file path.
  355.       int perm = PFileInfo::DefaultDirPerms    /// Permission on new directory.
  356.     );
  357.     /**Delete the directory.
  358.        @return
  359.        TRUE if directory was deleted.
  360.      */
  361.     BOOL Remove();
  362.     /**Delete the specified directory.
  363.        @return
  364.        TRUE if directory was deleted.
  365.      */
  366.     PINLINE static BOOL Remove(
  367.       const PString & path   /// Directory file path.
  368.     );
  369.   //@}
  370.   /**@name Directory listing functions */
  371.   //@{
  372.     /**Open the directory for scanning its list of files. Once opened the
  373.        #GetEntryName()# function may be used to get the current directory
  374.        entry and the #Next()# function used to move to the next directory
  375.        entry.
  376.        
  377.        Only files that are of a type that is specified in the mask will be
  378.        returned.
  379.        
  380.        Note that the directory scan will {bf not} return the "." and ".."
  381.        entries that some platforms support.
  382.        @return
  383.        TRUE if directory was successfully opened, and there was at least one
  384.        file in it of the specified types.
  385.      */
  386.     BOOL Open(
  387.       int scanMask = PFileInfo::AllFiles    /// Mask of files to provide.
  388.     );
  389.       
  390.     /**Restart file list scan from the beginning of directory. This is similar
  391.        to the #Open()# command but does not require that the directory be
  392.        closed (using #Close()#) first.
  393.        Only files that are of a type that is specified in the mask will be
  394.        returned.
  395.        Note that the directory scan will {bf not} return the "." and ".."
  396.        entries that some platforms support.
  397.        @return
  398.        TRUE if directory was successfully opened, and there was at least one
  399.        file in it of the specified types.
  400.      */
  401.     BOOL Restart(
  402.       int scanMask = PFileInfo::AllFiles    /// Mask of files to provide.
  403.     );
  404.       
  405.     /**Move to the next file in the directory scan.
  406.     
  407.        Only files that are of a type that is specified in the mask passed to
  408.        the #Open()# or #Restart()# functions will be returned.
  409.        Note that the directory scan will {bf not} return the "." and ".."
  410.        entries that some platforms support.
  411.        @return
  412.        TRUE if there is another valid file in the directory.
  413.      */
  414.     BOOL Next();
  415.       
  416.     /// Close the directory during or after a file list scan.
  417.     void Close();
  418.     /**Get the name (without the volume or directory path) of the current
  419.        entry in the directory scan. This may be the name of a file or a
  420.        subdirectory or even a link or device for operating systems that support
  421.        them.
  422.        
  423.        To get a full path name concatenate the PDirectory object itself with
  424.        the entry name.
  425.        
  426.        Note that the directory scan will {bf not} return the "." and ".."
  427.        entries that some platforms support.
  428.        @return
  429.        string for directory entry.
  430.      */
  431.     PFilePathString GetEntryName() const;
  432.     /**Determine if the directory entry currently being scanned is itself
  433.        another directory entry.
  434.        
  435.        Note that the directory scan will {bf not} return the "." and ".."
  436.        entries that some platforms support.
  437.        @return
  438.        TRUE if entry is a subdirectory.
  439.      */
  440.     BOOL IsSubDir() const;
  441.     /**Get file information on the current directory entry.
  442.     
  443.        @return
  444.        TRUE if file information was successfully retrieved.
  445.      */
  446.     BOOL GetInfo(
  447.       PFileInfo & info    /// Object to receive the file information.
  448.     ) const;
  449.   //@}
  450.   protected:
  451.     // New functions for class
  452.     void Construct();
  453.       // Common constructor code
  454.     // Member variables
  455.     /// Mask of file types that the directory scan will return.
  456.     int scanMask;
  457. #ifdef DOC_PLUS_PLUS
  458. };
  459. #endif
  460. // Class declaration continued in platform specific header file ///////////////