vcglib/wrap/Exif/src/paths.cpp

142 lines
3.9 KiB
C++

//--------------------------------------------------------------------------------
// Module to do path manipulation for file moving of jhead.
//
// Matthias Wandel Feb 2 2009
//--------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <ctype.h>
#include <sys/stat.h>
#ifdef _WIN32
#include <direct.h> // for mkdir under windows.
#define mkdir(dir,mode) mkdir(dir)
#undef S_ISDIR
#define S_ISDIR(a) (a & _S_IFDIR)
#endif
#include "../include/Exif/jhead.h"
//--------------------------------------------------------------------------------
// Ensure that a path exists
//--------------------------------------------------------------------------------
int EnsurePathExists(const char * FileName)
{
char NewPath[PATH_MAX*2];
int a;
int LastSlash = 0;
//printf("\nEnsure exists:%s\n",FileName);
// Extract the path component of the file name.
strcpy(NewPath, FileName);
a = strlen(NewPath);
for (;;){
a--;
if (a == 0){
NewPath[0] = 0;
break;
}
if (NewPath[a] == SLASH){
struct stat dummy;
NewPath[a] = 0;
if (stat(NewPath, &dummy) == 0){
if (S_ISDIR(dummy.st_mode)){
// Break out of loop, and go forward along path making
// the directories.
if (LastSlash == 0){
// Full path exists. No need to create any directories.
return 1;
}
break;
}else{
// Its a file.
fprintf(stderr,"Can't create path '%s' due to file conflict\n",NewPath);
return 0;
}
}
if (LastSlash == 0) LastSlash = a;
}
}
// Now work forward.
//printf("Existing First dir: '%s' a = %d\n",NewPath,a);
for(;FileName[a];a++){
if (FileName[a] == SLASH || a == 0){
if (a == LastSlash) break;
NewPath[a] = FileName[a];
//printf("make dir '%s'\n",NewPath);
#ifdef _WIN32
if (NewPath[1] == ':' && strlen(NewPath) == 2) continue;
#endif
if (mkdir(NewPath,0777)){
fprintf(stderr,"Could not create directory '%s'\n",NewPath);
// Failed to create directory.
return 0;
}
}
}
return 1;
}
//--------------------------------------------------------------------------------
// Make a new path out of a base path, and a filename.
// Basepath is the base path, and FilePath is a filename, or path + filename.
//--------------------------------------------------------------------------------
void CatPath(char * BasePath, const char * FilePath)
{
int l;
l = strlen(BasePath);
if (FilePath[1] == ':'){
// Its a windows absolute path.
l = 0;
}
if (FilePath[0] == SLASH || FilePath[0] == '.' || l == 0){
// Its an absolute path, or there was no base path.
strcpy(BasePath, FilePath);
return;
}
if (BasePath[l-1] != SLASH){
BasePath[l++] = SLASH;
BasePath[l] = 0;
}
strcat(BasePath, FilePath);
// Note that the combined path may contains things like "foo/../bar". We assume
// that the filesystem will take care of these.
}
/*
char Path1[] = "ztest\\cdir\\foo.jpg";
char Path2[] = "zxtest\\cdir\\foo.jpg";
char Path3[] = "\\tzest\\cdir\\foo.jpg";
char BasePath[100];
main()
{
EnsurePathExists(Path1);
EnsurePathExists(Path2);
EnsurePathExists(Path3);
CatPath(BasePath, "hello.txt");
CatPath(BasePath, "world\\hello.txt");
CatPath(BasePath, "\\hello.txt");
CatPath(BasePath, "c:\\hello.txt");
CatPath(BasePath, "c:\\world\\hello.txt");
CatPath(BasePath, "c:\\abresl\\hello.txt");
}
*/