fix: fix DICOM load bug with chinese path

This commit is contained in:
kradchen
2025-06-30 13:21:18 +08:00
parent b7fae104c9
commit 474c6b8d9e

View File

@@ -5,7 +5,8 @@
#include "dcmtk/dcmdata/dcdatset.h" #include "dcmtk/dcmdata/dcdatset.h"
#include "dcmtk/dcmdata/dcspchrs.h" #include "dcmtk/dcmdata/dcspchrs.h"
#include "ExtendMedicalImageProperties.h" #include "ExtendMedicalImageProperties.h"
#include <vtkDirectory.h> #include <QDir>
#include <qDebug>
#include <vtkNew.h> #include <vtkNew.h>
#include <unordered_map> #include <unordered_map>
#include <algorithm> #include <algorithm>
@@ -40,23 +41,19 @@ void DICOMHeaderHelper::Clear() {
} }
void DICOMHeaderHelper::readHeaderFromDir(const char * rootPath){ void DICOMHeaderHelper::readHeaderFromDir(const char * rootPath){
vtkNew<vtkDirectory> dir; QDir dir(QString::fromLocal8Bit(rootPath));
dir->Open(rootPath); dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
vtkIdType fileCount = dir->GetNumberOfFiles(); dir.setSorting(QDir::Name | QDir::DirsFirst);
for (vtkIdType i = 0; i < fileCount; ++i) { QFileInfoList list = dir.entryInfoList();
const char* file_path = dir->GetFile(i); for(auto file : list)
if (strcmp(".",file_path)==0 || strcmp("..",file_path)==0 ) continue;
std::string path(rootPath);
path.append("\\");
path.append(file_path);
std::cout<<"file path:"<<path<<std::endl;
if (dir->FileIsDirectory(path.c_str()))
{ {
readHeaderFromDir(path.c_str()); std::string apath = file.absoluteFilePath().toLocal8Bit().toStdString();
if (file.isDir())
{
readHeaderFromDir(apath.data());
} }
else{ else{
readHeaderFromFile(path.c_str()); readHeaderFromFile(apath.data());
} }
} }
} }
@@ -249,22 +246,19 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){
void DICOMHeaderHelper::ReadHeader() { void DICOMHeaderHelper::ReadHeader() {
if (!this->dirName.empty()){ if (!this->dirName.empty()){
vtkNew<vtkDirectory> dir; QDir dir(QString::fromLocal8Bit(dirName.data()));
dir->Open(this->dirName.c_str()); dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
vtkIdType fileCount = dir->GetNumberOfFiles(); dir.setSorting(QDir::Name | QDir::DirsFirst);
for (vtkIdType i = 0; i < fileCount; ++i) { QFileInfoList list = dir.entryInfoList();
const char* file_path = dir->GetFile(i); for(auto file : list)
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()))
{ {
readHeaderFromDir(path.c_str()); std::string apath = file.absoluteFilePath().toLocal8Bit().toStdString();
if (file.isDir())
{
readHeaderFromDir(apath.data());
} }
else{ else{
readHeaderFromFile(path.c_str()); readHeaderFromFile(apath.data());
} }
} }
} }