You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
6.1 KiB
263 lines
6.1 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkDirectory.cxx,v $
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
#include "vtkDirectory.h"
|
||
|
|
||
|
#include "vtkDebugLeaks.h"
|
||
|
|
||
|
#include <sys/stat.h>
|
||
|
|
||
|
vtkCxxRevisionMacro(vtkDirectory, "$Revision: 1.25.12.1 $");
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Needed when we don't use the vtkStandardNewMacro.
|
||
|
vtkInstantiatorNewMacro(vtkDirectory);
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
vtkDirectory* vtkDirectory::New()
|
||
|
{
|
||
|
#ifdef VTK_DEBUG_LEAKS
|
||
|
vtkDebugLeaks::ConstructClass("vtkDirectory");
|
||
|
#endif
|
||
|
return new vtkDirectory;
|
||
|
}
|
||
|
|
||
|
vtkDirectory::vtkDirectory()
|
||
|
: Path(0), Files(0), NumberOfFiles(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
void vtkDirectory::CleanUpFilesAndPath()
|
||
|
{
|
||
|
for(int i =0; i < this->NumberOfFiles; i++)
|
||
|
{
|
||
|
delete [] this->Files[i];
|
||
|
}
|
||
|
delete [] this->Files;
|
||
|
delete [] this->Path;
|
||
|
this->Files = 0;
|
||
|
this->Path = 0;
|
||
|
this->NumberOfFiles = 0;
|
||
|
}
|
||
|
|
||
|
vtkDirectory::~vtkDirectory()
|
||
|
{
|
||
|
this->CleanUpFilesAndPath();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void vtkDirectory::PrintSelf(ostream& os, vtkIndent indent)
|
||
|
{
|
||
|
this->Superclass::PrintSelf(os, indent);
|
||
|
if(!this->Path)
|
||
|
{
|
||
|
os << indent << "Directory not open\n";
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
os << indent << "Directory for: " << this->Path << "\n";
|
||
|
os << indent << "Contains the following files:\n";
|
||
|
indent = indent.GetNextIndent();
|
||
|
for(int i =0; i < this->NumberOfFiles; i++)
|
||
|
{
|
||
|
os << indent << this->Files[i] << "\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// First microsoft and borland compilers
|
||
|
|
||
|
#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__)
|
||
|
#include "vtkWindows.h"
|
||
|
#include <io.h>
|
||
|
#include <ctype.h>
|
||
|
#include <direct.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
int vtkDirectory::Open(const char* name)
|
||
|
{
|
||
|
// clean up from any previous open
|
||
|
this->CleanUpFilesAndPath();
|
||
|
char* buf=0;
|
||
|
int n = static_cast<int>(strlen(name));
|
||
|
if (name[n - 1] == '/')
|
||
|
{
|
||
|
buf = new char[n + 1 + 1];
|
||
|
sprintf(buf, "%s*", name);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
buf = new char[n + 2 + 1];
|
||
|
sprintf(buf, "%s/*", name);
|
||
|
}
|
||
|
struct _finddata_t data; // data of current file
|
||
|
|
||
|
// First count the number of files in the directory
|
||
|
#if _MSC_VER < 1300
|
||
|
long srchHandle;
|
||
|
#else
|
||
|
intptr_t srchHandle;
|
||
|
#endif
|
||
|
srchHandle = _findfirst(buf, &data);
|
||
|
if (srchHandle == -1)
|
||
|
{
|
||
|
this->NumberOfFiles = 0;
|
||
|
_findclose(srchHandle);
|
||
|
delete[] buf;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
this->NumberOfFiles = 1;
|
||
|
|
||
|
while(_findnext(srchHandle, &data) != -1)
|
||
|
{
|
||
|
this->NumberOfFiles++;
|
||
|
}
|
||
|
this->Files = new char*[this->NumberOfFiles];
|
||
|
// close the handle
|
||
|
_findclose(srchHandle);
|
||
|
// Now put them into the file array
|
||
|
srchHandle = _findfirst(buf, &data);
|
||
|
delete [] buf;
|
||
|
|
||
|
if (srchHandle == -1)
|
||
|
{
|
||
|
this->NumberOfFiles = 0;
|
||
|
_findclose(srchHandle);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// Loop through names
|
||
|
int i = 0;
|
||
|
do
|
||
|
{
|
||
|
this->Files[i] = strcpy(new char[strlen(data.name)+1], data.name);
|
||
|
i++;
|
||
|
}
|
||
|
while (_findnext(srchHandle, &data) != -1);
|
||
|
this->Path = strcpy(new char[strlen(name)+1], name);
|
||
|
return _findclose(srchHandle) != -1;
|
||
|
}
|
||
|
|
||
|
const char* vtkDirectory::GetCurrentWorkingDirectory(char* buf,
|
||
|
unsigned int len)
|
||
|
{
|
||
|
return _getcwd(buf, len);
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
// Now the POSIX style directory access
|
||
|
|
||
|
#include <sys/types.h>
|
||
|
#include <dirent.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
int vtkDirectory::Open(const char* name)
|
||
|
{
|
||
|
// clean up from any previous open
|
||
|
this->CleanUpFilesAndPath();
|
||
|
|
||
|
DIR* dir = opendir(name);
|
||
|
if (!dir)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
this->NumberOfFiles = 0;
|
||
|
dirent* d =0;
|
||
|
|
||
|
for (d = readdir(dir); d; d = readdir(dir))
|
||
|
{
|
||
|
this->NumberOfFiles++;
|
||
|
}
|
||
|
this->Files = new char*[this->NumberOfFiles];
|
||
|
closedir(dir);
|
||
|
|
||
|
dir = opendir(name);
|
||
|
if (!dir)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
int i = 0;
|
||
|
for (d = readdir(dir); d; d = readdir(dir))
|
||
|
{
|
||
|
this->Files[i] = strcpy(new char[strlen(d->d_name)+1], d->d_name);
|
||
|
i++;
|
||
|
}
|
||
|
this->Path = strcpy(new char[strlen(name)+1], name);
|
||
|
closedir(dir);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
const char* vtkDirectory::GetCurrentWorkingDirectory(char* buf,
|
||
|
unsigned int len)
|
||
|
{
|
||
|
return getcwd(buf, len);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
int vtkDirectory::MakeDirectory(const char* dir)
|
||
|
{
|
||
|
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) \
|
||
|
|| defined(__MINGW32__))
|
||
|
return _mkdir(dir) == 0;
|
||
|
#else
|
||
|
return mkdir(dir, 00777) == 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
const char* vtkDirectory::GetFile(int index)
|
||
|
{
|
||
|
if(index >= this->NumberOfFiles || index < 0)
|
||
|
{
|
||
|
vtkErrorMacro( << "Bad index for GetFile on vtkDirectory\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return this->Files[index];
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
#ifndef VTK_LEGACY_REMOVE
|
||
|
# ifdef VTK_WORKAROUND_WINDOWS_MANGLE
|
||
|
# undef CreateDirectory
|
||
|
int vtkDirectory::CreateDirectoryA(const char* dir)
|
||
|
{
|
||
|
VTK_LEGACY_REPLACED_BODY(vtkDirectory::CreateDirectory, "VTK 5.0",
|
||
|
vtkDirectory::MakeDirectory);
|
||
|
return vtkDirectory::MakeDirectory(dir);
|
||
|
}
|
||
|
int vtkDirectory::CreateDirectoryW(const char* dir)
|
||
|
{
|
||
|
VTK_LEGACY_REPLACED_BODY(vtkDirectory::CreateDirectory, "VTK 5.0",
|
||
|
vtkDirectory::MakeDirectory);
|
||
|
return vtkDirectory::MakeDirectory(dir);
|
||
|
}
|
||
|
# endif
|
||
|
int vtkDirectory::CreateDirectory(const char* dir)
|
||
|
{
|
||
|
VTK_LEGACY_REPLACED_BODY(vtkDirectory::CreateDirectory, "VTK 5.0",
|
||
|
vtkDirectory::MakeDirectory);
|
||
|
return vtkDirectory::MakeDirectory(dir);
|
||
|
}
|
||
|
#endif
|