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/dcspchrs.h"
#include "ExtendMedicalImageProperties.h"
#include <vtkDirectory.h>
#include <QDir>
#include <qDebug>
#include <vtkNew.h>
#include <unordered_map>
#include <algorithm>
@@ -40,23 +41,19 @@ void DICOMHeaderHelper::Clear() {
}
void DICOMHeaderHelper::readHeaderFromDir(const char * rootPath){
vtkNew<vtkDirectory> 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:"<<path<<std::endl;
if (dir->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)
{
readHeaderFromDir(path.c_str());
std::string apath = file.absoluteFilePath().toLocal8Bit().toStdString();
if (file.isDir())
{
readHeaderFromDir(apath.data());
}
else {
readHeaderFromFile(path.c_str());
else{
readHeaderFromFile(apath.data());
}
}
}
@@ -249,22 +246,19 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){
void DICOMHeaderHelper::ReadHeader() {
if (!this->dirName.empty()){
vtkNew<vtkDirectory> 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)
{
readHeaderFromDir(path.c_str());
std::string apath = file.absoluteFilePath().toLocal8Bit().toStdString();
if (file.isDir())
{
readHeaderFromDir(apath.data());
}
else {
readHeaderFromFile(path.c_str());
else{
readHeaderFromFile(apath.data());
}
}
}