private static string GetFileName(MetadataReader reader, DocumentHandle documentHandle) { var document = reader.GetDocument(documentHandle); if (document.Name.IsNil) { return null; } var nameReader = reader.GetBlobReader(document.Name); int separator = nameReader.ReadByte(); if (!FileNameUtilities.IsDirectorySeparator((char)separator)) { return FileNameUtilities.GetFileName(reader.GetString(document.Name)); } // find the last part handle: BlobHandle partHandle = default(BlobHandle); while (nameReader.RemainingBytes > 0) { partHandle = nameReader.ReadBlobHandle(); } if (partHandle.IsNil) { return string.Empty; } var partReader = reader.GetBlobReader(partHandle); var part = partReader.ReadUTF8(partReader.Length); if (part.IndexOf('\0') >= 0) { // bad metadata return null; } // it is valid to encode document name so that the parts contain directory separators: return FileNameUtilities.GetFileName(part); }