From 474c6b8d9e40b6fc2afceca736d7b32727f45c9d Mon Sep 17 00:00:00 2001 From: kradchen Date: Mon, 30 Jun 2025 13:21:18 +0800 Subject: [PATCH] fix: fix DICOM load bug with chinese path --- src/src/IO/DICOM/DICOMHeaderHelper.cpp | 58 ++++++++++++-------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/src/src/IO/DICOM/DICOMHeaderHelper.cpp b/src/src/IO/DICOM/DICOMHeaderHelper.cpp index 792aee7..1a44922 100644 --- a/src/src/IO/DICOM/DICOMHeaderHelper.cpp +++ b/src/src/IO/DICOM/DICOMHeaderHelper.cpp @@ -5,7 +5,8 @@ #include "dcmtk/dcmdata/dcdatset.h" #include "dcmtk/dcmdata/dcspchrs.h" #include "ExtendMedicalImageProperties.h" -#include +#include +#include #include #include #include @@ -40,25 +41,21 @@ void DICOMHeaderHelper::Clear() { } void DICOMHeaderHelper::readHeaderFromDir(const char * rootPath){ - vtkNew dir; - dir->Open(rootPath); - vtkIdType fileCount = dir->GetNumberOfFiles(); - for (vtkIdType i = 0; i < fileCount; ++i) { - const char* file_path = dir->GetFile(i); - if (strcmp(".",file_path)==0 || strcmp("..",file_path)==0 ) continue; - std::string path(rootPath); - path.append("\\"); - path.append(file_path); - std::cout<<"file path:"<FileIsDirectory(path.c_str())) + QDir dir(QString::fromLocal8Bit(rootPath)); + dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); + dir.setSorting(QDir::Name | QDir::DirsFirst); + QFileInfoList list = dir.entryInfoList(); + for(auto file : list) + { + std::string apath = file.absoluteFilePath().toLocal8Bit().toStdString(); + if (file.isDir()) { - readHeaderFromDir(path.c_str()); + readHeaderFromDir(apath.data()); } - else { - readHeaderFromFile(path.c_str()); + else{ + readHeaderFromFile(apath.data()); } - } + } } void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){ @@ -249,24 +246,21 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){ void DICOMHeaderHelper::ReadHeader() { if (!this->dirName.empty()){ - vtkNew dir; - dir->Open(this->dirName.c_str()); - vtkIdType fileCount = dir->GetNumberOfFiles(); - for (vtkIdType i = 0; i < fileCount; ++i) { - const char* file_path = dir->GetFile(i); - if (strcmp(".",file_path)==0 || strcmp("..",file_path)==0 ) continue; - std::string path(dirName); - path.append("\\"); - path.append(file_path); - - if (dir->FileIsDirectory(path.c_str())) + QDir dir(QString::fromLocal8Bit(dirName.data())); + dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); + dir.setSorting(QDir::Name | QDir::DirsFirst); + QFileInfoList list = dir.entryInfoList(); + for(auto file : list) + { + std::string apath = file.absoluteFilePath().toLocal8Bit().toStdString(); + if (file.isDir()) { - readHeaderFromDir(path.c_str()); + readHeaderFromDir(apath.data()); } - else { - readHeaderFromFile(path.c_str()); + else{ + readHeaderFromFile(apath.data()); } - } + } } else{ readHeaderFromFile(this->fileName.c_str());