Files
sbox-public/engine/Sandbox.Engine/Systems/Filesystem/KeyStore.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

90 lines
1.9 KiB
C#

namespace Sandbox;
/// <summary>
/// Allows storing files by hashed keys, rather than by actual filename. This is sometimes useful.
/// </summary>
public sealed class KeyStore
{
private BaseFileSystem _fs { get; set; }
private KeyStore()
{
}
/// <summary>
/// Creates a keystore which is in a global cache position. The folder can be
/// deleted at any time, and it's all fine and no-one cares.
/// </summary>
public static KeyStore CreateGlobalCache()
{
var ks = new KeyStore();
// make sure this folder exists
EngineFileSystem.Root.CreateDirectory( "/.source2/cache" );
ks._fs = EngineFileSystem.Root.CreateSubSystem( "/.source2/cache" );
return ks;
}
private string GetPath( string key )
{
key ??= "null";
return $"{key.Md5()}.bin";
}
/// <summary>
/// Store a bunch of bytes
/// </summary>
public void Set( string key, byte[] data )
{
if ( key is null ) throw new ArgumentNullException( nameof( key ) );
if ( data is null ) throw new ArgumentNullException( nameof( data ) );
_fs.WriteAllBytes( GetPath( key ), data );
}
/// <summary>
/// Get stored bytes, or return null
/// </summary>
public byte[] Get( string key )
{
var path = GetPath( key );
return _fs.FileExists( path ) ? _fs.ReadAllBytes( path ).ToArray() : null;
}
/// <summary>
/// Get stored bytes, or return false
/// </summary>
public bool TryGet( string key, out byte[] data )
{
var path = GetPath( key );
if ( _fs.FileExists( path ) )
{
data = _fs.ReadAllBytes( path ).ToArray();
return true;
}
data = Array.Empty<byte>();
return false;
}
/// <summary>
/// Check if a key exists
/// </summary>
public bool Exists( string key )
{
return _fs.FileExists( GetPath( key ) );
}
/// <summary>
/// Remove a key
/// </summary>
public void Remove( string key )
{
var path = GetPath( key );
if ( _fs.FileExists( path ) )
_fs.DeleteFile( path );
}
}