Merge pull request #142 from vibe-d/file_info_exception_fix

Make the DirEntry->FileInfo conversion nothrow.
This commit is contained in:
Leonid Kramer 2019-03-25 19:04:58 +01:00 committed by GitHub
commit a48f8f00bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -729,22 +729,33 @@ struct DirectoryChange {
private FileInfo makeFileInfo(DirEntry ent) private FileInfo makeFileInfo(DirEntry ent)
@trusted { @trusted nothrow {
import std.algorithm.comparison : among;
FileInfo ret; FileInfo ret;
auto fullname = ent.name.endsWith('/') || ent.name.endsWith('\\') ? ent.name[0 .. $-1] : ent.name; if (!ent.name.length) return ret;
auto fullname = ent.name[$-1].among('/', '\\') ? ent.name[0 .. $-1] : ent.name;
ret.name = baseName(fullname); ret.name = baseName(fullname);
if (ret.name.length == 0) ret.name = fullname; if (ret.name.length == 0) ret.name = fullname;
ret.size = ent.size;
try {
ret.isFile = ent.isFile;
ret.isDirectory = ent.isDir;
ret.isSymlink = ent.isSymlink;
ret.timeModified = ent.timeLastModified; ret.timeModified = ent.timeLastModified;
version(Windows) ret.timeCreated = ent.timeCreated; version(Windows) ret.timeCreated = ent.timeCreated;
else ret.timeCreated = ent.timeLastModified; else ret.timeCreated = ent.timeLastModified;
ret.isSymlink = ent.isSymlink; ret.size = ent.size;
ret.isDirectory = ent.isDir; } catch (Exception e) {
ret.isFile = ent.isFile; logDebug("Failed to get information for file '%s': %s", fullname, e.msg);
}
version (Windows) { version (Windows) {
import core.sys.windows.windows : FILE_ATTRIBUTE_HIDDEN; import core.sys.windows.windows : FILE_ATTRIBUTE_HIDDEN;
ret.hidden = (ent.attributes & FILE_ATTRIBUTE_HIDDEN) != 0; ret.hidden = (ent.attributes & FILE_ATTRIBUTE_HIDDEN) != 0;
} }
else ret.hidden = ret.name.startsWith('.'); else ret.hidden = ret.name[0] == '.' && ret.name != "." && ret.name != "..";
return ret; return ret;
} }