Skip to content

Commit 6beccb0

Browse files
committed
fix: file/dir name codec error (easymodo#354)
current method to resolve path is not corret due to encoding issues, simply using QDir/QFileInfo to replace std::filesystem and std::string.
1 parent 4c12677 commit 6beccb0

File tree

4 files changed

+57
-72
lines changed

4 files changed

+57
-72
lines changed

qimgv/components/directorymanager/directorymanager.cpp

+37-54
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#include "directorymanager.h"
22

3+
#include <QDir>
4+
#include <QFileInfo>
5+
36
namespace fs = std::filesystem;
47

58
DirectoryManager::DirectoryManager() :
@@ -320,64 +323,45 @@ void DirectoryManager::loadEntryList(QString directoryPath, bool recursive) {
320323

321324
// both directories & files
322325
void DirectoryManager::addEntriesFromDirectory(std::vector<FSEntry> &entryVec, QString directoryPath) {
323-
QRegularExpressionMatch match;
324-
for(const auto & entry : fs::directory_iterator(toStdString(directoryPath))) {
325-
QString name = QString::fromStdString(entry.path().filename().generic_string());
326+
QDir root(directoryPath);
327+
root.setFilter(QDir::Dirs | QDir::Files
326328
#ifndef Q_OS_WIN32
327-
// ignore hidden files
328-
if(name.startsWith("."))
329-
continue;
329+
| QDir::NoDot
330330
#endif
331-
QString path = QString::fromStdString(entry.path().generic_string());
332-
match = regex.match(name);
333-
if(entry.is_directory()) { // this can still throw std::bad_alloc ..
334-
FSEntry newEntry;
335-
try {
336-
newEntry.name = name;
337-
newEntry.path = path;
338-
newEntry.isDirectory = true;
339-
//newEntry.size = entry.file_size();
340-
//newEntry.modifyTime = entry.last_write_time();
341-
} catch (const std::filesystem::filesystem_error &err) {
342-
qDebug() << "[DirectoryManager]" << err.what();
343-
continue;
344-
}
331+
);
332+
333+
QRegularExpressionMatch match{};
334+
for (const auto &entry : root.entryInfoList()) {
335+
match = regex.match(entry.absoluteFilePath());
336+
if (!entry.isDir() && !match.hasMatch()) { continue; }
337+
FSEntry newEntry{};
338+
newEntry.name = entry.fileName();
339+
newEntry.path = entry.absoluteFilePath();
340+
newEntry.isDirectory = entry.isDir();
341+
if (newEntry.isDirectory) {
345342
dirEntryVec.emplace_back(newEntry);
346-
} else if (match.hasMatch()) {
347-
FSEntry newEntry;
348-
try {
349-
newEntry.name = name;
350-
newEntry.path = path;
351-
newEntry.isDirectory = false;
352-
newEntry.size = entry.file_size();
353-
newEntry.modifyTime = entry.last_write_time();
354-
} catch (const std::filesystem::filesystem_error &err) {
355-
qDebug() << "[DirectoryManager]" << err.what();
356-
continue;
357-
}
343+
} else {
344+
newEntry.size = entry.size();
345+
newEntry.modifyTime = entry.lastModified();
358346
entryVec.emplace_back(newEntry);
359347
}
360348
}
361349
}
362350

363351
void DirectoryManager::addEntriesFromDirectoryRecursive(std::vector<FSEntry> &entryVec, QString directoryPath) {
364-
QRegularExpressionMatch match;
365-
for(const auto & entry : fs::recursive_directory_iterator(toStdString(directoryPath))) {
366-
QString name = QString::fromStdString(entry.path().filename().generic_string());
367-
QString path = QString::fromStdString(entry.path().generic_string());
368-
match = regex.match(name);
369-
if(!entry.is_directory() && match.hasMatch()) {
370-
FSEntry newEntry;
371-
try {
372-
newEntry.name = name;
373-
newEntry.path = path;
374-
newEntry.isDirectory = false;
375-
newEntry.size = entry.file_size();
376-
newEntry.modifyTime = entry.last_write_time();
377-
} catch (const std::filesystem::filesystem_error &err) {
378-
qDebug() << "[DirectoryManager]" << err.what();
379-
continue;
380-
}
352+
QDir root(directoryPath);
353+
root.setFilter(QDir::Files);
354+
355+
QRegularExpressionMatch match{};
356+
for (const auto &entry : root.entryInfoList()) {
357+
match = regex.match(entry.absoluteFilePath());
358+
if (match.hasMatch()) {
359+
FSEntry newEntry{};
360+
newEntry.name = entry.fileName();
361+
newEntry.path = entry.absoluteFilePath();
362+
newEntry.isDirectory = entry.isDir();
363+
newEntry.size = entry.size();
364+
newEntry.modifyTime = entry.lastModified();
381365
entryVec.emplace_back(newEntry);
382366
}
383367
}
@@ -417,9 +401,8 @@ bool DirectoryManager::insertFileEntry(const QString &filePath) {
417401
bool DirectoryManager::forceInsertFileEntry(const QString &filePath) {
418402
if(!this->isFile(filePath) || containsFile(filePath))
419403
return false;
420-
std::filesystem::directory_entry stdEntry(toStdString(filePath));
421-
QString fileName = QString::fromStdString(stdEntry.path().filename().generic_string()); // isn't it beautiful
422-
FSEntry FSEntry(filePath, fileName, stdEntry.file_size(), stdEntry.last_write_time(), stdEntry.is_directory());
404+
QFileInfo file(filePath);
405+
FSEntry FSEntry(file.absoluteFilePath(), file.fileName(), file.size(), file.lastModified(), file.isDir());
423406
insert_sorted(fileEntryVec, FSEntry, std::bind(compareFunction(), this, std::placeholders::_1, std::placeholders::_2));
424407
if(!directoryPath().isEmpty()) {
425408
qDebug() << "fileIns" << filePath << directoryPath();
@@ -471,8 +454,8 @@ void DirectoryManager::renameFileEntry(const QString &oldFilePath, const QString
471454
int oldIndex = indexOfFile(oldFilePath);
472455
fileEntryVec.erase(fileEntryVec.begin() + oldIndex);
473456
// insert
474-
std::filesystem::directory_entry stdEntry(toStdString(newFilePath));
475-
FSEntry FSEntry(newFilePath, newFileName, stdEntry.file_size(), stdEntry.last_write_time(), stdEntry.is_directory());
457+
QFileInfo file(newFilePath);
458+
FSEntry FSEntry(file.absoluteFilePath(), file.fileName(), file.size(), file.lastModified(), file.isDir());
476459
insert_sorted(fileEntryVec, FSEntry, std::bind(compareFunction(), this, std::placeholders::_1, std::placeholders::_2));
477460
qDebug() << "fileRen" << oldFilePath << newFilePath;
478461
emit fileRenamed(oldFilePath, oldIndex, newFilePath, indexOfFile(newFilePath));

qimgv/components/loader/loaderrunnable.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ LoaderRunnable::LoaderRunnable(QString _path) : path(_path) {
88
void LoaderRunnable::run() {
99
//QElapsedTimer t;
1010
//t.start();
11+
qDebug() << "Loading " << path;
1112
auto image = ImageFactory::createImage(path);
1213
//qDebug() << "L: " << t.elapsed();
1314
emit finished(image, path);

qimgv/sourcecontainers/fsentry.cpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,49 @@
11
#include "fsentry.h"
22

3+
#include <QDir>
4+
35
FSEntry::FSEntry() {
46
}
57

68
FSEntry::FSEntry(const QString &path) {
7-
std::filesystem::directory_entry stdEntry(toStdString(path));
8-
QString name = QString::fromStdString(stdEntry.path().filename().generic_string());
9-
if(stdEntry.is_directory()) {
10-
try {
11-
this->name = name;
12-
this->path = path;
13-
this->isDirectory = true;
14-
} catch (const std::filesystem::filesystem_error &err) { }
9+
QFileInfo file(path);
10+
if(file.isDir()) {
11+
this->name = file.fileName();
12+
this->path = file.absoluteFilePath();
13+
this->isDirectory = true;
1514
} else {
16-
try {
17-
this->name = name;
18-
this->path = path;
19-
this->isDirectory = false;
20-
this->size = stdEntry.file_size();
21-
this->modifyTime = stdEntry.last_write_time();
22-
} catch (const std::filesystem::filesystem_error &err) { }
15+
this->name = file.fileName();
16+
this->path = file.absoluteFilePath();
17+
this->isDirectory = false;
18+
this->size = file.size();
19+
this->modifyTime = file.lastModified();
2320
}
2421
}
2522

26-
FSEntry::FSEntry( QString _path, QString _name, std::uintmax_t _size, std::filesystem::file_time_type _modifyTime, bool _isDirectory)
23+
FSEntry::FSEntry( QString _path, QString _name, std::uintmax_t _size, QDateTime _modifyTime, bool _isDirectory)
2724
: path(_path),
2825
name(_name),
2926
size(_size),
3027
modifyTime(_modifyTime),
3128
isDirectory(_isDirectory)
3229
{
3330
}
31+
3432
FSEntry::FSEntry( QString _path, QString _name, std::uintmax_t _size, bool _isDirectory)
3533
: path(_path),
3634
name(_name),
3735
size(_size),
3836
isDirectory(_isDirectory)
3937
{
4038
}
39+
4140
FSEntry::FSEntry( QString _path, QString _name, bool _isDirectory)
4241
: path(_path),
4342
name(_name),
4443
isDirectory(_isDirectory)
4544
{
4645
}
46+
4747
bool FSEntry::operator==(const QString &anotherPath) const {
4848
return this->path == anotherPath;
4949
}

qimgv/sourcecontainers/fsentry.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
#pragma once
22
#include <QString>
3+
#include <QDateTime>
34
#include <filesystem>
45
#include "utils/stuff.h"
56

67
class FSEntry {
78
public:
89
FSEntry();
910
FSEntry( const QString &filePath);
10-
FSEntry( QString _path, QString _name, std::uintmax_t _size, std::filesystem::file_time_type _modifyTime, bool _isDirectory);
11+
FSEntry( QString _path, QString _name, std::uintmax_t _size, QDateTime _modifyTime, bool _isDirectory);
1112
FSEntry( QString _path, QString _name, std::uintmax_t _size, bool _isDirectory);
1213
FSEntry( QString _path, QString _name, bool _isDirectory);
1314
bool operator==(const QString &anotherPath) const;
1415

1516
QString path, name;
1617
std::uintmax_t size;
17-
std::filesystem::file_time_type modifyTime;
18+
QDateTime modifyTime;
1819
bool isDirectory;
1920
};

0 commit comments

Comments
 (0)