public override Int32 Overwrite( Object fileNode, Object fileDesc0, UInt32 fileAttributes, Boolean replaceFileAttributes, UInt64 allocationSize, out FileInfo fileInfo) { FileDescriptor fileDesc = (FileDescriptor)fileDesc0; MakeWriteable(fileDesc); if (replaceFileAttributes) { fileDesc.SetFileAttributes(fileAttributes | (UInt32)System.IO.FileAttributes.Archive); } else if (0 != fileAttributes) { fileDesc.SetFileAttributes(fileDesc.GetFileAttributes() | fileAttributes | (UInt32)System.IO.FileAttributes.Archive); } fileDesc.WriteStream.SetLength(0); return(fileDesc.GetFileInfo(out fileInfo)); }
public Int32 GetFileInfo(out FileInfo FileInfo) { if (null != Stream) { BY_HANDLE_FILE_INFORMATION Info; if (!GetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(), out Info)) { ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error()); } FileInfo.FileAttributes = Info.dwFileAttributes; FileInfo.ReparseTag = 0; FileInfo.FileSize = (UInt64)Stream.Length; FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1) / ALLOCATION_UNIT * ALLOCATION_UNIT; FileInfo.CreationTime = Info.ftCreationTime; FileInfo.LastAccessTime = Info.ftLastAccessTime; FileInfo.LastWriteTime = Info.ftLastWriteTime; FileInfo.ChangeTime = FileInfo.LastWriteTime; FileInfo.IndexNumber = 0; FileInfo.HardLinks = 0; } else { GetFileInfoFromFileSystemInfo(DirInfo, out FileInfo); } return(STATUS_SUCCESS); }
public override Int32 Open( String FileName, UInt32 CreateOptions, UInt32 GrantedAccess, out Object FileNode0, out Object FileDesc, out FileInfo FileInfo, out String NormalizedName) { FileNode0 = default(Object); FileDesc = default(Object); FileInfo = default(FileInfo); NormalizedName = default(String); FileNode FileNode; Int32 Result; FileNode = FileNodeMap.Get(FileName); if (null == FileNode) { Result = STATUS_OBJECT_NAME_NOT_FOUND; FileNodeMap.GetParent(FileName, ref Result); return(Result); } Interlocked.Increment(ref FileNode.OpenCount); FileNode0 = FileNode; FileInfo = FileNode.GetFileInfo(); NormalizedName = FileNode.FileName; return(STATUS_SUCCESS); }
public override int GetDirInfoByName( Object ParentNode0, Object FileDesc, String FileName, out String NormalizedName, out FileInfo FileInfo) { FileNode ParentNode = (FileNode)ParentNode0; FileNode FileNode; FileName = ParentNode.FileName + ("\\" == ParentNode.FileName ? "" : "\\") + Path.GetFileName(FileName); FileNode = FileNodeMap.Get(FileName); if (null == FileNode) { NormalizedName = default(String); FileInfo = default(FileInfo); return(STATUS_OBJECT_NAME_NOT_FOUND); } NormalizedName = Path.GetFileName(FileNode.FileName); FileInfo = FileNode.FileInfo; return(STATUS_SUCCESS); }
public Int32 GetFileInfo(out FileInfo fileInfo) { if (IsWriteable()) { if (IsFile()) { return(Utils.GetFileInfoFromFileStream(WriteStream, out fileInfo)); } else { return(Utils.GetFileInfoFromDirectoryInfo(WriteDirInfo, out fileInfo)); } } else { if (IsFile()) { return(Utils.GetFileInfoFromFileStream(ReadOnlyStream, out fileInfo)); } else { return(Utils.GetFileInfoFromDirectoryInfo(ReadOnlyDirInfo, out fileInfo)); } } }
public override Boolean ReadDirectoryEntry( Object FileNode, Object FileDesc, String Pattern, String Marker, ref Object Context, out String FileName, out FileInfo FileInfo) { IEnumerator <String> Enumerator = (IEnumerator <String>)Context; if (null == Enumerator) { List <String> ChildrenFileNames = new List <String>(); for (int Index = 1, Count = FileCount(); Count >= Index; Index++) { ChildrenFileNames.Add(String.Format("{0}", Index)); } Context = Enumerator = ChildrenFileNames.GetEnumerator(); } while (Enumerator.MoveNext()) { FileName = Enumerator.Current; FillFileInfo(int.Parse(FileName), out FileInfo); return(true); } FileName = default(String); FileInfo = default(FileInfo); return(false); }
public override Int32 Open( String FileName, UInt32 CreateOptions, UInt32 GrantedAccess, out Object FileNode, out Object FileDesc0, out FileInfo FileInfo, out String NormalizedName) { FileNode = default; NormalizedName = default; if (string.IsNullOrEmpty(FileName) || FileName == "\\") { // No file path? Return some info about the root dir.. var fileDesc = new FileInstance(null, this); FileDesc0 = fileDesc; return(fileDesc.GetFileInfo(out FileInfo)); } var foundEntry = FindFile(FileName); if (foundEntry == null) { FileInfo = default; FileDesc0 = null; return(STATUS_OBJECT_NAME_NOT_FOUND); } var fileDesc2 = new FileInstance(foundEntry, this); FileDesc0 = fileDesc2; return(fileDesc2.GetFileInfo(out FileInfo)); }
public override Int32 Open( String FileName, UInt32 CreateOptions, UInt32 GrantedAccess, out Object FileNode, out Object FileDesc, out FileInfo FileInfo, out String NormalizedName) { FileNode = default(Object); FileDesc = default(Object); FileInfo = default(FileInfo); NormalizedName = default(String); int Index = FileLookup(FileName); if (-1 == Index) { return(STATUS_OBJECT_NAME_NOT_FOUND); } FileNode = Index; FillFileInfo(Index, out FileInfo); return(STATUS_SUCCESS); }
public override Boolean ReadDirectoryEntry( Object FileNode, Object FileDesc0, String Pattern, String Marker, ref Object Context, out String FileName, out FileInfo FileInfo) { var Instance = (FileInstance)FileDesc0; var Enumerator = (IEnumerator <IFileEntry>)Context; if (Enumerator == null) { var childArr = RootFiles; if (Instance.FileEntry != null) { childArr = Instance.FileEntry.Children; } Enumerator = childArr.GetEnumerator(); Context = Enumerator; int Index = 0; if (null != Marker) { Index = childArr.FindIndex(s => s.Name == Marker); if (0 <= Index) { Index++; } else { Index = ~Index; } } if (Index > 0) { for (int i = 0; i < Index; i++) { Enumerator.MoveNext(); } } } if (Enumerator.MoveNext()) { var entry = Enumerator.Current; FileName = entry.Name; var desc = new FileInstance(entry, this); desc.GetFileInfo(out FileInfo); return(true); } FileName = default; FileInfo = default; return(false); }
public override Int32 GetFileInfo( Object fileNode, Object fileDesc0, out FileInfo fileInfo) { FileDescriptor fileDesc = (FileDescriptor)fileDesc0; return(fileDesc.GetFileInfo(out fileInfo)); }
public override Int32 GetFileInfo( Object FileNode, Object FileDesc0, out FileInfo FileInfo) { var instance = (FileInstance)FileDesc0; return(instance.GetFileInfo(out FileInfo)); }
public override Int32 GetFileInfo( Object FileNode, Object FileDesc0, out FileInfo FileInfo) { FileDesc FileDesc = (FileDesc)FileDesc0; return(FileDesc.GetFileInfo(out FileInfo)); }
public override Int32 GetFileInfo( Object FileNode0, Object FileDesc, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; FileInfo = FileNode.GetFileInfo(); return(STATUS_SUCCESS); }
public override Int32 GetFileInfo( Object FileNode, Object FileDesc, out FileInfo FileInfo) { int Index = (int)FileNode; FillFileInfo(Index, out FileInfo); return(STATUS_SUCCESS); }
public override Int32 Write( Object FileNode0, Object FileDesc, IntPtr Buffer, UInt64 Offset, UInt32 Length, Boolean WriteToEndOfFile, Boolean ConstrainedIo, out UInt32 BytesTransferred, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; UInt64 EndOffset; if (ConstrainedIo) { if (Offset >= FileNode.FileInfo.FileSize) { BytesTransferred = default(UInt32); FileInfo = default(FileInfo); return(STATUS_SUCCESS); } EndOffset = Offset + Length; if (EndOffset > FileNode.FileInfo.FileSize) { EndOffset = FileNode.FileInfo.FileSize; } } else { if (WriteToEndOfFile) { Offset = FileNode.FileInfo.FileSize; } EndOffset = Offset + Length; if (EndOffset > FileNode.FileInfo.FileSize) { Int32 Result = SetFileSizeInternal(FileNode, EndOffset, false); if (0 > Result) { BytesTransferred = default(UInt32); FileInfo = default(FileInfo); return(Result); } } } BytesTransferred = (UInt32)(EndOffset - Offset); Marshal.Copy(Buffer, FileNode.FileData, (int)Offset, (int)BytesTransferred); FileInfo = FileNode.GetFileInfo(); return(STATUS_SUCCESS); }
private static void FillFileInfo(int Index, out FileInfo FileInfo) { FileInfo = default(FileInfo); FileInfo.FileAttributes = 0 == Index ? (UInt32)System.IO.FileAttributes.Directory : 0; FileInfo.FileSize = (UInt64)FileContents(Index).Length; FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1) / ALLOCATION_UNIT * ALLOCATION_UNIT; FileInfo.CreationTime = FileInfo.LastAccessTime = FileInfo.LastWriteTime = FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); }
public override Int32 Flush( Object FileNode0, Object FileDesc, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; /* nothing to flush, since we do not cache anything */ FileInfo = null != FileNode?FileNode.GetFileInfo() : default(FileInfo); return(STATUS_SUCCESS); }
public override Int32 Overwrite( Object FileNode0, Object FileDesc, UInt32 FileAttributes, Boolean ReplaceFileAttributes, UInt64 AllocationSize, out FileInfo FileInfo) { FileInfo = default(FileInfo); FileNode FileNode = (FileNode)FileNode0; Int32 Result; List <String> StreamFileNames = new List <String>(FileNodeMap.GetStreamFileNames(FileNode)); foreach (String StreamFileName in StreamFileNames) { FileNode StreamNode = FileNodeMap.Get(StreamFileName); if (null == StreamNode) { continue; /* should not happen */ } if (0 == StreamNode.OpenCount) { FileNodeMap.Remove(StreamNode); } } Result = SetFileSizeInternal(FileNode, AllocationSize, true); if (0 > Result) { return(Result); } if (ReplaceFileAttributes) { FileNode.FileInfo.FileAttributes = FileAttributes | (UInt32)System.IO.FileAttributes.Archive; } else { FileNode.FileInfo.FileAttributes |= FileAttributes | (UInt32)System.IO.FileAttributes.Archive; } FileNode.FileInfo.FileSize = 0; FileNode.FileInfo.LastAccessTime = FileNode.FileInfo.LastWriteTime = FileNode.FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); FileInfo = FileNode.GetFileInfo(); return(STATUS_SUCCESS); }
public override Int32 SetBasicInfo( Object FileNode, Object FileDesc0, UInt32 FileAttributes, UInt64 CreationTime, UInt64 LastAccessTime, UInt64 LastWriteTime, UInt64 ChangeTime, out FileInfo FileInfo) { FileDesc FileDesc = (FileDesc)FileDesc0; FileDesc.SetBasicInfo(FileAttributes, CreationTime, LastAccessTime, LastWriteTime); return(FileDesc.GetFileInfo(out FileInfo)); }
public override Int32 SetFileSize( Object FileNode0, Object FileDesc, UInt64 NewSize, Boolean SetAllocationSize, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; Int32 Result; Result = SetFileSizeInternal(FileNode, NewSize, SetAllocationSize); FileInfo = 0 <= Result?FileNode.GetFileInfo() : default(FileInfo); return(STATUS_SUCCESS); }
public FileInfo GetFileInfo() { if (null == MainFileNode) { return(this.FileInfo); } else { FileInfo FileInfo = MainFileNode.FileInfo; FileInfo.FileAttributes &= ~(UInt32)FileAttributes.Directory; /* named streams cannot be directories */ FileInfo.AllocationSize = this.FileInfo.AllocationSize; FileInfo.FileSize = this.FileInfo.FileSize; return(FileInfo); } }
public static Int32 GetFileInfoFromFileSystemInfo(FileSystemInfo Info, out FileInfo FileInfo) { FileInfo.FileAttributes = (UInt32)Info.Attributes; FileInfo.ReparseTag = 0; FileInfo.FileSize = Info is System.IO.FileInfo ? (UInt64)((System.IO.FileInfo)Info).Length : 0; FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1) / ALLOCATION_UNIT * ALLOCATION_UNIT; FileInfo.CreationTime = (UInt64)Info.CreationTimeUtc.ToFileTimeUtc(); FileInfo.LastAccessTime = (UInt64)Info.LastAccessTimeUtc.ToFileTimeUtc(); FileInfo.LastWriteTime = (UInt64)Info.LastWriteTimeUtc.ToFileTimeUtc(); FileInfo.ChangeTime = FileInfo.LastWriteTime; FileInfo.IndexNumber = 0; FileInfo.HardLinks = 0; return(FileSystemBase.STATUS_SUCCESS); }
public override Int32 Flush( Object FileNode, Object FileDesc0, out FileInfo FileInfo) { FileDesc FileDesc = (FileDesc)FileDesc0; if (null == FileDesc) { /* we do not flush the whole volume, so just return SUCCESS */ FileInfo = default(FileInfo); return(STATUS_SUCCESS); } FileDesc.Stream.Flush(true); return(FileDesc.GetFileInfo(out FileInfo)); }
public override Int32 SetBasicInfo( Object fileNode, Object fileDesc0, UInt32 fileAttributes, UInt64 creationTime, UInt64 lastAccessTime, UInt64 lastWriteTime, UInt64 changeTime, out FileInfo fileInfo) { FileDescriptor fileDesc = (FileDescriptor)fileDesc0; MakeWriteable(fileDesc); fileDesc.SetBasicInfo(fileAttributes, creationTime, lastAccessTime, lastWriteTime); return(fileDesc.GetFileInfo(out fileInfo)); }
public override Int32 Flush( Object fileNode, Object fileDesc0, out FileInfo fileInfo) { FileDescriptor fileDesc = (FileDescriptor)fileDesc0; if (null == fileDesc) { /* we do not flush the whole volume, so just return SUCCESS */ fileInfo = default(FileInfo); return(STATUS_SUCCESS); } fileDesc.Flush(); return(fileDesc.GetFileInfo(out fileInfo)); }
public override Int32 Open( String FileName, UInt32 CreateOptions, UInt32 GrantedAccess, out Object FileNode, out Object FileDesc0, out FileInfo FileInfo, out String NormalizedName) { FileDesc FileDesc = null; try { FileName = ConcatPath(FileName); if (!Directory.Exists(FileName)) { FileDesc = new FileDesc( new FileStream( FileName, FileMode.Open, (FileSystemRights)GrantedAccess, FileShare.Read | FileShare.Write | FileShare.Delete, 4096, 0)); } else { FileDesc = new FileDesc( new DirectoryInfo(FileName)); } FileNode = default(Object); FileDesc0 = FileDesc; NormalizedName = default(String); return(FileDesc.GetFileInfo(out FileInfo)); } catch { if (null != FileDesc && null != FileDesc.Stream) { FileDesc.Stream.Dispose(); } throw; } }
public Int32 GetFileInfo(out FileInfo FileInfo) { FileInfo = new FileInfo(); FileInfo.FileAttributes = (uint)FileAttributes.Directory; if (FileEntry != null) { FileInfo.CreationTime = (ulong)FileEntry.CreationTime.ToFileTimeUtc(); FileInfo.LastWriteTime = FileInfo.ChangeTime = (ulong)FileEntry.LastWriteTime.ToFileTimeUtc(); FileInfo.LastAccessTime = (ulong)FileEntry.LastAccessTime.ToFileTimeUtc(); FileInfo.FileSize = FileEntry.Size; FileInfo.AllocationSize = Utility.RoundToPages(FileEntry.Size, (ulong)FileSystem.SectorSize) * (ulong)FileSystem.SectorSize; FileInfo.FileAttributes = FileEntry.IsDirectory ? (uint)FileAttributes.Directory : 0; } FileInfo.FileAttributes |= (uint)FileAttributes.ReadOnly; return(STATUS_SUCCESS); }
public override Int32 Write( Object fileNode, Object fileDesc0, IntPtr buffer, UInt64 offset, UInt32 length, Boolean writeToEndOfFile, Boolean constrainedIo, out UInt32 pBytesTransferred, out FileInfo fileInfo) { FileDescriptor fileDesc = (FileDescriptor)fileDesc0; MakeWriteable(fileDesc); FileStream stream = fileDesc.WriteStream; if (constrainedIo) { if (offset >= (UInt64)stream.Length) { pBytesTransferred = default(UInt32); fileInfo = default(FileInfo); return(STATUS_SUCCESS); } if (offset + length > (UInt64)stream.Length) { length = (UInt32)((UInt64)stream.Length - offset); } } Byte[] bytes = new byte[length]; Marshal.Copy(buffer, bytes, 0, bytes.Length); if (!writeToEndOfFile) { stream.Seek((Int64)offset, SeekOrigin.Begin); } stream.Write(bytes, 0, bytes.Length); pBytesTransferred = (UInt32)bytes.Length; return(fileDesc.GetFileInfo(out fileInfo)); }
public override Int32 SetBasicInfo( Object FileNode0, Object FileDesc, UInt32 FileAttributes, UInt64 CreationTime, UInt64 LastAccessTime, UInt64 LastWriteTime, UInt64 ChangeTime, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; if (null != FileNode.MainFileNode) { FileNode = FileNode.MainFileNode; } if (unchecked ((UInt32)(-1)) != FileAttributes) { FileNode.FileInfo.FileAttributes = FileAttributes; } if (0 != CreationTime) { FileNode.FileInfo.CreationTime = CreationTime; } if (0 != LastAccessTime) { FileNode.FileInfo.LastAccessTime = LastAccessTime; } if (0 != LastWriteTime) { FileNode.FileInfo.LastWriteTime = LastWriteTime; } if (0 != ChangeTime) { FileNode.FileInfo.ChangeTime = ChangeTime; } FileInfo = FileNode.GetFileInfo(); return(STATUS_SUCCESS); }
public override Int32 SetFileSize( Object FileNode, Object FileDesc0, UInt64 NewSize, Boolean SetAllocationSize, out FileInfo FileInfo) { FileDesc FileDesc = (FileDesc)FileDesc0; if (!SetAllocationSize || (UInt64)FileDesc.Stream.Length > NewSize) { /* * "FileInfo.FileSize > NewSize" explanation: * Ptfs does not support allocation size. However if the new AllocationSize * is less than the current FileSize we must truncate the file. */ FileDesc.Stream.SetLength((Int64)NewSize); } return(FileDesc.GetFileInfo(out FileInfo)); }