VFileSystem.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const VFileSystem_cxx_Version =
  51.     "$Id: VFileSystem.cxx,v 1.1 2001/03/30 02:49:21 icahoon Exp $";
  52. #include <dirent.h>
  53. #include <errno.h>
  54. #include <fcntl.h>
  55. #include <stdio.h>
  56. #include <sys/stat.h>
  57. #include <sys/types.h>
  58. #include <unistd.h>
  59. #include <utime.h>
  60. #include "VFileSystem.hxx"
  61. #include "VIoException.hxx"
  62. string
  63. VFileSystem::readFile( const string& fileName )
  64. throw(VException&)
  65. {
  66.     FILE* file = fopen( fileName.c_str(), "rb" );
  67.     if ( !file )
  68.     {
  69.         throw VIoException( strerror(errno),
  70.                             __FILE__,
  71.                             __LINE__,
  72.                             errno );
  73.     }
  74.     const int bufSize = 4096;
  75.     char buf[4096];
  76.     string ret;
  77.     while ( !feof(file) )
  78.     {
  79.         int s = fread( buf, sizeof(char), bufSize, file );
  80.         if ( ferror(file) )
  81.         {
  82.             throw VIoException( strerror(errno),
  83.                                 __FILE__,
  84.                                 __LINE__,
  85.                                 errno );
  86.         }
  87.         ret.append(buf, s);
  88.     }
  89.     int err = fclose( file );
  90.     if ( err != 0 )
  91.     {
  92.         throw VIoException( strerror(errno),
  93.                             __FILE__ ,
  94.                             __LINE__ ,
  95.                             errno );
  96.     }
  97.     return ret;
  98. }
  99. void
  100. VFileSystem::writeFile( const string& fileName, const string& data )
  101. throw(VException&)
  102. {
  103.     FILE* file = fopen( fileName.c_str(), "wb" );
  104.     if ( !file )
  105.     {
  106.         throw VIoException( strerror(errno),
  107.                             __FILE__ ,
  108.                             __LINE__ ,
  109.                             errno );
  110.     }
  111.     const char* buf = data.c_str();
  112.     unsigned int len = data.length();
  113.     while ( len > 0 )
  114.     {
  115.         int e = fwrite( buf, sizeof(char), len, file );
  116.         buf += e;
  117.         len -= e;
  118.         if ( ferror(file) )
  119.         {
  120.             throw VIoException( strerror(errno),
  121.                                 __FILE__ ,
  122.                                 __LINE__ ,
  123.                                 errno );
  124.         }
  125.     }
  126.     int err = fclose( file );
  127.     if ( err != 0 )
  128.     {
  129.         throw VIoException( strerror(errno),
  130.                             __FILE__ ,
  131.                             __LINE__ ,
  132.                             errno );
  133.     }
  134. }
  135. void
  136. VFileSystem::setFileTime( const string& fileName, TimeStamp time )
  137. throw(VException&)
  138. {
  139.     struct utimbuf buf;
  140.     buf.actime = time;
  141.     buf.modtime = time;
  142.     int err = utime(fileName.c_str(), &buf);
  143.     if (err != 0 )
  144.     {
  145.         throw VIoException( strerror(errno),
  146.                             __FILE__
  147.                             , __LINE__ ,
  148.                             errno );
  149.     }
  150. }
  151. TimeStamp
  152. VFileSystem::getFileTime( const string& fileName)
  153. throw(VException&)
  154. {
  155.     struct stat buf;
  156.     int err = stat( fileName.c_str(), &buf );
  157.     if ( err != 0 )
  158.     {
  159.         throw VIoException( strerror(errno),
  160.                             __FILE__ ,
  161.                             __LINE__ ,
  162.                             errno );
  163.     }
  164.     time_t t = buf.st_mtime;
  165.     TimeStamp ret = t;
  166.     return ret;
  167. }
  168. int
  169. VFileSystem::getFileSize( const string& fileName)
  170. throw(VException&)
  171. {
  172.     struct stat buf;
  173.     int err = stat( fileName.c_str(), &buf );
  174.     if ( err != 0 )
  175.     {
  176.         throw VIoException( strerror(errno),
  177.                             __FILE__ ,
  178.                             __LINE__ ,
  179.                             errno );
  180.     }
  181.     return buf.st_size;
  182. }
  183. void
  184. VFileSystem::removeFile( const string& fileName )
  185. throw(VException&)
  186. {
  187.     int err = unlink(fileName.c_str());
  188.     if ( err != 0 )
  189.     {
  190.         throw VIoException( strerror(errno),
  191.                             __FILE__ ,
  192.                             __LINE__ ,
  193.                             errno );
  194.     }
  195. }
  196. bool
  197. VFileSystem::fileExists( const string& fileName )
  198. throw(VException&)
  199. {
  200.     struct stat buf;
  201.     int err = stat( fileName.c_str(), &buf );
  202.     if ( err != 0 )
  203.     {
  204.         switch ( errno )
  205.         {
  206.             case EBADF:
  207.             case ENOENT:
  208.             case ENOTDIR:
  209.             return false;
  210.             default:
  211.             {
  212.                 throw VIoException( strerror(errno),
  213.                                     __FILE__,
  214.                                     __LINE__,
  215.                                     errno );
  216.             }
  217.         }
  218.     }
  219.     int isFile = S_ISREG(buf.st_mode);
  220.     return isFile;
  221. }
  222. void
  223. VFileSystem::createDir( const string& dirName )
  224. throw(VException&)
  225. {
  226.     mode_t mode = 0777;
  227.     int err = mkdir( dirName.c_str(), mode );
  228.     if ( err != 0 )
  229.     {
  230.         switch ( errno )
  231.         {
  232.             case EEXIST:
  233.             break;
  234.             default:
  235.             {
  236.                 throw VIoException( strerror(errno),
  237.                                     __FILE__ ,
  238.                                     __LINE__ ,
  239.                                     errno );
  240.             }
  241.         }
  242.     }
  243. }
  244. void VFileSystem::removeDir( const string& dirName )
  245. throw(VException&)
  246. {
  247.     int err = rmdir(dirName.c_str());
  248.     if ( err != 0 )
  249.     {
  250.         switch ( errno )
  251.         {
  252.             default:
  253.             {
  254.                 throw VIoException(strerror(errno)
  255.                                    , __FILE__ ,
  256.                                    __LINE__
  257.                                    , errno );
  258.             }
  259.         }
  260.     }
  261. }
  262. bool
  263. VFileSystem::dirExists( const string& dirName )
  264. throw(VException&)
  265. {
  266.     struct stat buf;
  267.     int err = stat( dirName.c_str(), &buf );
  268.     if ( err != 0 )
  269.     {
  270.         switch ( errno )
  271.         {
  272.             case EBADF:
  273.             case ENOENT:
  274.             case ENOTDIR:
  275.             return false;
  276.             default:
  277.             {
  278.                 throw VIoException( strerror(errno),
  279.                                     __FILE__ ,
  280.                                     __LINE__ ,
  281.                                     errno );
  282.             }
  283.         }
  284.     }
  285.     int isDir = S_ISDIR(buf.st_mode);
  286.     return isDir;
  287. }
  288. StringList
  289. VFileSystem::readDir( const string& dirName)
  290. throw(VException&)
  291. {
  292.     StringList list;
  293.     DIR* dir = opendir(dirName.c_str());
  294.     if ( dir == NULL )
  295.     {
  296.         throw VIoException( strerror(errno),
  297.                             __FILE__ ,
  298.                             __LINE__ ,
  299.                             errno );
  300.     }
  301.     struct dirent * dirp = readdir(dir);
  302.     dirp = readdir(dir);  // eat the "."
  303.     dirp = readdir(dir);  // eat the ".."
  304.     while ( dirp )
  305.     {
  306.         list.push_back( string(dirp->d_name) );
  307.         dirp = readdir(dir);
  308.     }
  309.     int err = closedir(dir);
  310.     if ( err != 0 )
  311.     {
  312.         throw VIoException( strerror(errno),
  313.                             __FILE__ ,
  314.                             __LINE__ ,
  315.                             errno );
  316.     }
  317.     return list;
  318. }