Directory.cxx 3.22 KB
Newer Older
1
2
3
4
5
/*=========================================================================

  Program:   KWSys - Kitware System Library
  Module:    Directory.cxx

Brad King's avatar
Brad King committed
6
7
  Copyright (c) Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8

Brad King's avatar
Brad King committed
9
10
     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11
12
13
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
14
15
#include "kwsysPrivate.h"
#include KWSYS_HEADER(Directory.hxx)
16

17
#include KWSYS_HEADER(Configure.hxx)
Brad King's avatar
Brad King committed
18

19
20
#include KWSYS_HEADER(stl/string)
#include KWSYS_HEADER(stl/vector)
21
22
23
24
25
26
27
28
29

namespace KWSYS_NAMESPACE
{

//----------------------------------------------------------------------------
class DirectoryInternals
{
public:
  // Array of Files
30
  kwsys_stl::vector<kwsys_stl::string> Files;
31
32
  
  // Path to Open'ed directory
33
  kwsys_stl::string Path;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
};

//----------------------------------------------------------------------------
Directory::Directory()
{
  this->Internal = new DirectoryInternals;
}

//----------------------------------------------------------------------------
Directory::~Directory()
{
  delete this->Internal;
}

//----------------------------------------------------------------------------
unsigned long Directory::GetNumberOfFiles()
{
Brad King's avatar
Brad King committed
51
  return static_cast<unsigned long>(this->Internal->Files.size());
52
53
54
55
56
57
58
59
60
61
62
63
64
65
}

//----------------------------------------------------------------------------
const char* Directory::GetFile(unsigned long dindex)
{
  if ( dindex >= this->Internal->Files.size() )
    {
    return 0;
    }
  return this->Internal->Files[dindex].c_str();
}

} // namespace KWSYS_NAMESPACE

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// First microsoft compilers

#ifdef _MSC_VER
#include <windows.h>
#include <io.h>
#include <ctype.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

namespace KWSYS_NAMESPACE
{

bool Directory::Load(const char* name)
{
84
85
86
87
88
#if _MSC_VER < 1300
  long srchHandle;
#else
  intptr_t srchHandle;
#endif
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  char* buf;
  size_t n = 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
  
  // Now put them into the file array
104
  srchHandle = _findfirst(buf, &data);
105
106
107
108
109
110
111
112
113
114
  delete [] buf;
  
  if ( srchHandle == -1 )
    {
    return 0;
    }
  
  // Loop through names
  do 
    {
115
    this->Internal->Files.push_back(data.name);
116
117
    } 
  while ( _findnext(srchHandle, &data) != -1 );
118
  this->Internal->Path = name;
119
120
121
122
123
124
125
126
127
128
129
  return _findclose(srchHandle) != -1;
}

} // namespace KWSYS_NAMESPACE

#else

// Now the POSIX style directory access

#include <sys/types.h>
#include <dirent.h>
130

131
132
133
134
135
136
137
138
139
140
141
142
143
144
namespace KWSYS_NAMESPACE
{

bool Directory::Load(const char* name)
{
  DIR* dir = opendir(name);

  if (!dir)
    {
    return 0;
    }

  for (dirent* d = readdir(dir); d; d = readdir(dir) )
    {
145
    this->Internal->Files.push_back(d->d_name);
146
    }
147
  this->Internal->Path = name;
148
149
150
  closedir(dir);
  return 1;
}
151

152
153
154
} // namespace KWSYS_NAMESPACE

#endif