FileHandling.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:4k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: FileHandling.cpp,v 1.6 2005/08/16 00:14:26 matz Exp $
  22. **/
  23. #include "Common.h"
  24. #include "FileHandling.h"
  25. #include "Exceptions.h"
  26. #include <errno.h>
  27. #ifdef USE_MFC
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif // _DEBUG
  33. #endif // USE_MFC
  34. #ifdef WIN32
  35. #include <direct.h>
  36. #define getcwd _getcwd
  37. #define chdir _chdir
  38. #else
  39. #include <unistd.h>
  40. char* _fullpath(char* absPath, const char* relPath, size_t maxLength);
  41. void _splitpath(const char* path, char* drive, char* dir, char* fname, char* ext);
  42. #define _MAX_PATH 260
  43. #define _MAX_FNAME 256
  44. #define _MAX_EXT 256
  45. #define _MAX_DRIVE 3
  46. #define _MAX_DIR 256
  47. #endif
  48. /** return current working directory
  49. */
  50. string GetCWD()
  51. {
  52.   char old_cwd[_MAX_PATH];
  53.   if (getcwd(old_cwd, _MAX_PATH)==NULL) {
  54.     if (errno == ERANGE) {
  55.       throw HVException("getcwd needs larger buffer");
  56.     }
  57.     throw HVException("getcwd error");
  58.   }
  59.   return string(old_cwd);
  60. }
  61. /** set current working directory
  62. */
  63. void SetCWD(const string& new_cwd)
  64. {
  65.   int error = chdir(new_cwd.c_str());
  66.   if (error) {
  67.     string err_str = "chdir error: can not find path: ";
  68.     err_str = err_str + new_cwd;
  69.     throw HVException(err_str);
  70.   }
  71. }
  72. /** first extend pathfile to the full, resolved, path; then
  73. * devide into drive+path and filename+extension
  74. */
  75. void SplitPathFile(const string& pathfile, string& vc_path, string& filename)
  76. {
  77.   char fullpath[_MAX_PATH];
  78.   if (_fullpath(fullpath, pathfile.c_str(), _MAX_PATH)==NULL) {
  79.     throw HVException("fullpath error");
  80.   }
  81.   char fname[_MAX_FNAME];
  82.   char ext[_MAX_EXT];
  83.   char drive[_MAX_DRIVE];
  84.   char dir[_MAX_DIR];
  85.   _splitpath(fullpath, drive, dir, fname, ext);
  86.   size_t len = strlen(dir);
  87.   while (len>=1 && dir[len-1]=='/' || dir[len-1]=='\') {
  88.     dir[len-1] = 0;
  89.     len = strlen(dir);
  90.   }
  91.   vc_path = string(drive)+string(dir);
  92.   filename = string(fname)+string(ext);
  93. }
  94. #if !defined(WIN32)
  95. char* _fullpath(char* absPath, const char* relPath, size_t maxLength)
  96. {
  97.   if (getcwd(absPath, maxLength)==NULL) {
  98.     if (maxLength>0) absPath[0] = 0;
  99.     return NULL;
  100.   }
  101.   int pos = strlen(absPath);
  102.   if (pos+strlen(relPath)+2<maxLength) {
  103.     sprintf(&absPath[pos], "/%s", relPath);
  104.     // todo: should use snprintf (WIN32: _snprintf)
  105.   }
  106.   char* up = strstr(absPath, "/..");
  107.   while (up) {
  108.     char* slashpos = up;
  109.     while (*slashpos=='/' && slashpos>absPath) slashpos--;
  110.     while (*slashpos!='/' && slashpos>absPath) slashpos--;
  111.     strcpy(slashpos, up+3);
  112.     up = strstr(absPath, "/..");
  113.   }
  114.   //  printf("fullpath: %sn", absPath);
  115.   return absPath;
  116. }
  117. void _splitpath(const char* path, char* drive, char* dir, char* fname, char* ext)
  118. {
  119.   drive[0] = 0;
  120.   dir[0] = 0;
  121.   fname[0] = 0;
  122.   ext[0] = 0;
  123.   
  124.   char* slashpos = strrchr(path, '/');
  125.   char* dotpos = strrchr(path, '.');
  126.   
  127.   if (slashpos==NULL) {
  128.     if (dotpos==NULL) {
  129.       strcpy(fname, path);
  130.     } else {
  131.       strncpy(fname, path, dotpos-path);
  132.       fname[dotpos-path] = 0;
  133.       strcpy(ext, dotpos);
  134.     }
  135.   } else {
  136.     if (dotpos!=NULL) {
  137.       strncpy(fname, slashpos+1, dotpos-slashpos-1);
  138.       fname[dotpos-slashpos-1] = 0;
  139.       strcpy(ext, dotpos);
  140.     } else {
  141.       strncpy(fname, slashpos+1, strlen(path)-strlen(slashpos)-1);
  142.       fname[strlen(path)-strlen(slashpos)-1] = 0;
  143.     }
  144.     strncpy(dir, path, slashpos-path);
  145.     dir[slashpos-path] = 0;
  146.   }
  147.   /*
  148.   printf("path: %s, %dn", path, strlen(path));
  149.   printf("drive: %s, %dn", drive, strlen(drive));
  150.   printf("dir: %s, %dn", dir, strlen(dir));
  151.   printf("fname: %s, %dn", fname, strlen(fname));
  152.   printf("ext: %s, %dn", ext, strlen(ext));
  153.   */
  154. }
  155. #endif // WIN32