/// <summary> /// Parses a VFS cas relative path to extract file placement data /// </summary> public static bool TryParseCasRelativePath(string casRelativePath, out VfsFilePlacementData data) { data = default; var parts = casRelativePath.Split(PathSplitChars); if (parts.Length != 3) { return(false); } if (Enum.TryParse <HashType>(parts[0], ignoreCase: true, out var hashType)) { try { var fileName = Path.GetFileNameWithoutExtension(parts[2]); var fileNameParts = fileName.Split(FilePlacementInfoFileNameSplitChars); if (fileNameParts.Length != 4) { return(false); } var hash = new ContentHash(hashType, HexUtilities.HexToBytes(fileNameParts[0])); if (Enum.TryParse <FileRealizationMode>(fileNameParts[1], out var realizationMode) && Enum.TryParse <FileAccessMode>(fileNameParts[2], out var accessMode)) { data = new VfsFilePlacementData(hash, realizationMode, accessMode); return(true); } } catch (Exception ex) { new ErrorResult(ex).IgnoreFailure(); return(false); } return(true); } else { return(false); } }
/// <summary> /// Creates a CAS relative path for the given placement data /// </summary> public static string CreateCasRelativePath(VfsFilePlacementData data, int nodeIndex) { var hashHex = data.Hash.ToHex(); return($@"{data.Hash.HashType}\{hashHex.Substring(0, 3)}\{hashHex}-{data.RealizationMode}-{data.AccessMode}-{nodeIndex}.blob"); }