//-------------------------------------------------------------------------------- // Module to do path manipulation for file moving of jhead. // // Matthias Wandel Feb 2 2009 //-------------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef _WIN32 #include // 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"); } */