aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/IO
diff options
context:
space:
mode:
authorLogan Douglas <42654828+JadedRain@users.noreply.github.com>2025-10-31 13:06:17 -0600
committerGitHub <noreply@github.com>2025-10-31 13:06:17 -0600
commit490bf347cbdf8ec458996d09ba40651eb647b7b9 (patch)
tree1bdad774667bf5e69f3fe7397a27f631a5ca617a /Emby.Server.Implementations/IO
parentfd6e48603bcf143a1bbc3b1bda26a8e1664f9379 (diff)
parent23929a3e709f4324d49271c02b0b047e1149e860 (diff)
Merge branch 'jellyfin:master' into master
Diffstat (limited to 'Emby.Server.Implementations/IO')
-rw-r--r--Emby.Server.Implementations/IO/ManagedFileSystem.cs51
1 files changed, 24 insertions, 27 deletions
diff --git a/Emby.Server.Implementations/IO/ManagedFileSystem.cs b/Emby.Server.Implementations/IO/ManagedFileSystem.cs
index c9630b8945..97e89ca3d9 100644
--- a/Emby.Server.Implementations/IO/ManagedFileSystem.cs
+++ b/Emby.Server.Implementations/IO/ManagedFileSystem.cs
@@ -152,6 +152,10 @@ namespace Emby.Server.Implementations.IO
/// <inheritdoc />
public void MoveDirectory(string source, string destination)
{
+ // Make sure parent directory of target exists
+ var parent = Directory.GetParent(destination);
+ parent?.Create();
+
try
{
Directory.Move(source, destination);
@@ -248,47 +252,40 @@ namespace Emby.Server.Implementations.IO
{
result.IsDirectory = info is DirectoryInfo || (info.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
- // if (!result.IsDirectory)
- // {
- // result.IsHidden = (info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden;
- // }
-
if (info is FileInfo fileInfo)
{
- result.Length = fileInfo.Length;
-
- // Issue #2354 get the size of files behind symbolic links. Also Enum.HasFlag is bad as it boxes!
- if ((fileInfo.Attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint)
+ result.CreationTimeUtc = GetCreationTimeUtc(info);
+ result.LastWriteTimeUtc = GetLastWriteTimeUtc(info);
+ if (fileInfo.LinkTarget is not null)
{
try
{
- using (var fileHandle = File.OpenHandle(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ var targetFileInfo = (FileInfo?)fileInfo.ResolveLinkTarget(returnFinalTarget: true);
+ if (targetFileInfo is not null)
{
- result.Length = RandomAccess.GetLength(fileHandle);
+ result.Exists = targetFileInfo.Exists;
+ if (result.Exists)
+ {
+ result.Length = targetFileInfo.Length;
+ result.CreationTimeUtc = GetCreationTimeUtc(targetFileInfo);
+ result.LastWriteTimeUtc = GetLastWriteTimeUtc(targetFileInfo);
+ }
+ }
+ else
+ {
+ result.Exists = false;
}
- }
- catch (FileNotFoundException ex)
- {
- // Dangling symlinks cannot be detected before opening the file unfortunately...
- _logger.LogError(ex, "Reading the file size of the symlink at {Path} failed. Marking the file as not existing.", fileInfo.FullName);
- result.Exists = false;
}
catch (UnauthorizedAccessException ex)
{
_logger.LogError(ex, "Reading the file at {Path} failed due to a permissions exception.", fileInfo.FullName);
}
- catch (IOException ex)
- {
- // IOException generally means the file is not accessible due to filesystem issues
- // Catch this exception and mark the file as not exist to ignore it
- _logger.LogError(ex, "Reading the file at {Path} failed due to an IO Exception. Marking the file as not existing", fileInfo.FullName);
- result.Exists = false;
- }
+ }
+ else
+ {
+ result.Length = fileInfo.Length;
}
}
-
- result.CreationTimeUtc = GetCreationTimeUtc(info);
- result.LastWriteTimeUtc = GetLastWriteTimeUtc(info);
}
else
{