14 #include <itkImageFileReader.h> 15 #include <itksys/Directory.hxx> 16 #include <itksys/SystemTools.hxx> 21 typedef std::vector<std::string> StringContainer;
22 typedef std::map<unsigned int, std::string> SortedStringContainer;
26 throw itk::ImageFileReaderException(__FILE__, __LINE__,
"FileName must be non-empty");
36 std::string basename, path;
37 path = itksys::SystemTools::GetFilenamePath(
m_FileName);
38 basename = itksys::SystemTools::GetFilenameName(
m_FileName);
40 unsigned int digitBegin = 0;
41 unsigned int digitEnd = 0;
42 bool digitFound =
false;
43 for (
unsigned int i = basename.length() - 1;; --i)
45 char character = basename[i];
46 if (character >=
'0' && character <=
'9')
73 itkWarningMacro(
"Filename contains no digit!");
80 unsigned int prefixBegin = 0;
81 unsigned int prefixLength = digitBegin;
82 unsigned int extensionBegin = digitEnd + 1;
83 unsigned int extensionLength = (digitEnd == basename.length() - 1 ? 0 : basename.length() - 1 - digitEnd);
84 unsigned int numberLength = digitEnd - digitBegin + 1;
89 std::string prefix =
"";
90 if (prefixLength != 0)
91 prefix = basename.substr(prefixBegin, prefixLength);
92 std::string extension =
"";
93 if (extensionLength != 0)
94 extension = basename.substr(extensionBegin, extensionLength);
110 if ((prefixLength + extensionLength + numberLength) != basename.length())
112 throw itk::ImageFileReaderException(
113 __FILE__, __LINE__,
"prefixLength + extensionLength + numberLength != basenameLength");
119 std::string directory = itksys::SystemTools::GetFilenamePath(
m_FileName);
120 itksys::Directory itkDir;
121 if (!itkDir.Load(directory.c_str()))
123 itkWarningMacro(<<
"Directory " << directory <<
" cannot be read!");
130 StringContainer unmatchedFiles;
132 for (
unsigned long i = 0; i < itkDir.GetNumberOfFiles(); i++)
135 std::string filename = directory +
"/" + itkDir.GetFile(i);
136 if (itksys::SystemTools::FileIsDirectory(filename.c_str()))
140 unmatchedFiles.push_back(itkDir.GetFile(i));
147 StringContainer matchedFiles;
148 for (
auto it = unmatchedFiles.begin(); it != unmatchedFiles.end(); ++it)
150 bool prefixMatch =
false;
151 bool extensionMatch =
false;
154 if (prefixLength != 0)
155 prefixMatch = (it->find(prefix) == prefixBegin);
157 prefixMatch = (((*it)[0] >=
'0') && ((*it)[0] <=
'9'));
160 if (extensionLength != 0)
161 extensionMatch = (it->find(extension) == it->length() - extensionLength);
164 (((*it)[it->length() - 1] >=
'0') && ((*it)[it->length() - 1] <=
'9'));
166 if (prefixMatch && extensionMatch)
168 matchedFiles.push_back(*it);
171 if (matchedFiles.size() == 0)
173 itkWarningMacro(<<
"Sorry, none of the files matched the prefix!");
182 SortedStringContainer sortedFiles;
183 for (
auto it = matchedFiles.begin(); it != matchedFiles.end(); ++it)
187 std::string number =
"";
188 std::string currentFilename(*it);
189 for (
unsigned int i = digitBegin; i < currentFilename.length(); ++i)
191 char character = currentFilename[i];
193 if (character >=
'0' && character <=
'9')
198 if (number.length() == 0)
202 itkWarningMacro(<<
"The filename " << *it
203 <<
"does not contain a valid digit sequence but matches prefix and extension. Skipping file!");
207 if ((number.length() + prefix.length() + extension.length()) != it->length())
212 <<
" matches prefix and extension, but the string in beteen is not a single digit-sequence. Skipping file!");
218 unsigned int num = atoi(number.c_str());
219 sortedFiles.insert(std::make_pair(num, directory +
"/" + *it));
223 if (sortedFiles.size() == 0)
225 itkWarningMacro(<<
"Sorry, no numbered files found, I can't load anything...");
234 unsigned long index = 0;
235 for (
auto it = sortedFiles.begin(); it != sortedFiles.end(); ++it, ++index)
238 MITK_INFO <<
"Added " << it->second <<
" to the set of matched files!" << std::endl;
virtual MatchedFileNames GetMatchedFileNames()
~FileSeriesReader() override
virtual bool GenerateFileList()
std::vector< std::string > MatchedFileNames
std::string m_FilePattern
MatchedFileNames m_MatchedFileNames