Flow.Launcher/Flow.Launcher.Infrastructure/UserSettings/DataLocation.cs

76 lines
3.3 KiB
C#
Raw Permalink Normal View History

using System;
using System.IO;
2020-04-21 09:12:17 +00:00
namespace Flow.Launcher.Infrastructure.UserSettings
{
public static class DataLocation
{
public const string PortableFolderName = "UserData";
public const string DeletionIndicatorFile = ".dead";
2025-09-21 08:21:38 +00:00
public static readonly string PortableDataPath = Path.Combine(Constant.ProgramDirectory, PortableFolderName);
public static readonly string RoamingDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "FlowLauncher");
public static string DataDirectory()
{
if (PortableDataLocationInUse())
return PortableDataPath;
return RoamingDataPath;
}
public static bool PortableDataLocationInUse()
{
2025-09-21 08:17:41 +00:00
if (Directory.Exists(PortableDataPath) &&
2025-09-21 08:21:38 +00:00
!File.Exists(Path.Combine(PortableDataPath, DeletionIndicatorFile)))
return true;
return false;
}
2025-09-21 08:45:25 +00:00
public static string VersionLogDirectory => Path.Combine(LogDirectory, Constant.Version);
public static string LogDirectory => Path.Combine(DataDirectory(), Constant.Logs);
2025-09-21 08:21:38 +00:00
public static readonly string CacheDirectory = Path.Combine(DataDirectory(), Constant.Cache);
public static readonly string SettingsDirectory = Path.Combine(DataDirectory(), Constant.Settings);
public static readonly string PluginsDirectory = Path.Combine(DataDirectory(), Constant.Plugins);
public static readonly string ThemesDirectory = Path.Combine(DataDirectory(), Constant.Themes);
2025-09-21 08:21:38 +00:00
public static readonly string PluginSettingsDirectory = Path.Combine(SettingsDirectory, Constant.Plugins);
public static readonly string PluginCacheDirectory = Path.Combine(DataDirectory(), Constant.Cache, Constant.Plugins);
public const string PythonEnvironmentName = "Python";
public const string NodeEnvironmentName = "Node.js";
public const string PluginEnvironments = "Environments";
2025-09-21 08:19:13 +00:00
public const string PluginDeleteFile = "NeedDelete.txt";
2025-09-21 08:21:38 +00:00
public static readonly string PluginEnvironmentsPath = Path.Combine(DataDirectory(), PluginEnvironments);
/// <summary>
/// Resolves a path that may be relative to an absolute path.
/// If the path is already absolute, returns it as-is.
/// If the path is not rooted (as determined by <see cref="Path.IsPathRooted(string)"/>), resolves it relative to ProgramDirectory.
/// </summary>
/// <param name="path">The path to resolve</param>
/// <returns>An absolute path</returns>
public static string ResolveAbsolutePath(string path)
{
if (string.IsNullOrEmpty(path))
return path;
// If already absolute, return as-is
if (Path.IsPathFullyQualified(path))
return path;
// Resolve relative to ProgramDirectory, handling invalid path formats gracefully
try
{
return Path.GetFullPath(Path.Combine(Constant.ProgramDirectory, path));
}
2026-02-21 12:34:57 +00:00
catch (System.Exception)
{
// If the path cannot be resolved (invalid characters, format, or too long),
// return the original path to avoid crashing the application.
return path;
}
}
}
}