You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The argument causes information for the link target to be returned for the following properties. When there is no target they throw no such file.
classFileInfo{publicboolIsReadOnly{get{thrownull;}set{}}publiclongLength{get{thrownull;}}}classFileSystemInfo{publicFileAttributesAttributes{get{thrownull;}set{}}publicDateTimeCreationTime{get{thrownull;}set{}}publicDateTimeCreationTimeUtc{get{thrownull;}set{}}publicabstractboolExists{get;}publicDateTimeLastAccessTime{get{thrownull;}set{}}publicDateTimeLastAccessTimeUtc{get{thrownull;}set{}}publicDateTimeLastWriteTime{get{thrownull;}set{}}publicDateTimeLastWriteTimeUtc{get{thrownull;}set{}}// from https://github.com/dotnet/runtime/issues/24271// always returns `false` when `followLinks` is `true`.publicboolIsSymbolicLink{get;}}
It does not affect the following operations. Which are either:
always working on the target, or
working on the 'fileName'/'path' argument.
classDirectoryInfo{// applies to 'path':publicDirectoryInfo?Parent{get{thrownull;}}publicDirectoryInfoRoot{get{thrownull;}}// applies to 'target':publicvoidCreate(){}publicDirectoryInfoCreateSubdirectory(stringpath){thrownull;}publicIEnumerable<DirectoryInfo>EnumerateDirectories(){thrownull;}publicIEnumerable<DirectoryInfo>EnumerateDirectories(stringsearchPattern){thrownull;}publicIEnumerable<DirectoryInfo>EnumerateDirectories(stringsearchPattern,EnumerationOptionsenumerationOptions){thrownull;}publicIEnumerable<DirectoryInfo>EnumerateDirectories(stringsearchPattern,SearchOptionsearchOption){thrownull;}publicIEnumerable<FileInfo>EnumerateFiles(){thrownull;}publicIEnumerable<FileInfo>EnumerateFiles(stringsearchPattern){thrownull;}publicIEnumerable<FileInfo>EnumerateFiles(stringsearchPattern,EnumerationOptionsenumerationOptions){thrownull;}publicIEnumerable<FileInfo>EnumerateFiles(stringsearchPattern,SearchOptionsearchOption){thrownull;}publicIEnumerable<FileSystemInfo>EnumerateFileSystemInfos(){thrownull;}publicIEnumerable<FileSystemInfo>EnumerateFileSystemInfos(stringsearchPattern){thrownull;}publicIEnumerable<FileSystemInfo>EnumerateFileSystemInfos(stringsearchPattern,EnumerationOptionsenumerationOptions){thrownull;}publicIEnumerable<FileSystemInfo>EnumerateFileSystemInfos(stringsearchPattern,SearchOptionsearchOption){thrownull;}publicDirectoryInfo[]GetDirectories(){thrownull;}publicDirectoryInfo[]GetDirectories(stringsearchPattern){thrownull;}publicDirectoryInfo[]GetDirectories(stringsearchPattern,EnumerationOptionsenumerationOptions){thrownull;}publicDirectoryInfo[]GetDirectories(stringsearchPattern,SearchOptionsearchOption){thrownull;}publicFileInfo[]GetFiles(){thrownull;}publicFileInfo[]GetFiles(stringsearchPattern){thrownull;}publicFileInfo[]GetFiles(stringsearchPattern,EnumerationOptionsenumerationOptions){thrownull;}publicFileInfo[]GetFiles(stringsearchPattern,SearchOptionsearchOption){thrownull;}publicFileSystemInfo[]GetFileSystemInfos(){thrownull;}publicFileSystemInfo[]GetFileSystemInfos(stringsearchPattern){thrownull;}publicFileSystemInfo[]GetFileSystemInfos(stringsearchPattern,EnumerationOptionsenumerationOptions){thrownull;}publicFileSystemInfo[]GetFileSystemInfos(stringsearchPattern,SearchOptionsearchOption){thrownull;}// applies to 'path':publicvoidDelete(boolrecursive){}publicoverridevoidDelete(){}publicvoidMoveTo(stringdestDirName){}}classFileInfo{// applies to 'fileName'publicDirectoryInfo?Directory{get{thrownull;}}publicstring?DirectoryName{get{thrownull;}}// applies to 'target':publicStreamWriterAppendText(){thrownull;}publicFileInfoCopyTo(stringdestFileName){thrownull;}publicFileInfoCopyTo(stringdestFileName,booloverwrite){thrownull;}publicFileStreamCreate(){thrownull;}publicStreamWriterCreateText(){thrownull;}publicvoidDecrypt(){}publicvoidEncrypt(){}publicFileStreamOpen(FileModemode){thrownull;}publicFileStreamOpen(FileModemode,FileAccessaccess){thrownull;}publicFileStreamOpen(FileModemode,FileAccessaccess,FileShareshare){thrownull;}publicFileStreamOpenRead(){thrownull;}publicStreamReaderOpenText(){thrownull;}publicFileStreamOpenWrite(){thrownull;}publicFileInfoReplace(stringdestinationFileName,string?destinationBackupFileName){thrownull;}publicFileInfoReplace(stringdestinationFileName,string?destinationBackupFileName,boolignoreMetadataErrors){thrownull;}// applies to 'path':publicoverridevoidDelete(){}publicvoidMoveTo(stringdestFileName){}publicvoidMoveTo(stringdestFileName,booloverwrite){}}classFileSystemInfo{// applies to 'fileName'/'path':protectedstringFullPath;protectedstringOriginalPath;publicstringExtension{get{thrownull;}}publicvirtualstringFullName{get{thrownull;}}publicabstractstringName{get;}}
Usage Examples
FileInfofile=newFileInfo("/tmp/my-file",followLinks:true);DateTimelastWriteTime=file.LastWriteTimeUtc;while(true){Thread.Sleep(1000);file.Refresh();DateTimewriteTime=file.LastWriteTimeUtc;if(writeTime!=lastWriteTime){Console.WriteLine("The file has changed");lastWriteTime=writeTime;}}
Implementation
On Linux, this means the information for the properties is retrieved using stat instead of vstat.
For Delete, the final target is first located, e.g. by calling realpath, and that is then deleted.
Background and Motivation
Users may not be aware that the
fileName/paththey are providing is a symbolic link.This proposal makes it possible to operate on such path without the user having to manually handle symbolic links using the APIs added in #24271.
Proposed API
A new constructor on
FileInfoallows to specify whether the instance should return information about the target instead of the symbolic link.The argument causes information for the link target to be returned for the following properties. When there is no target they throw no such file.
It does not affect the following operations. Which are either:
Usage Examples
Implementation
On Linux, this means the information for the properties is retrieved using
statinstead ofvstat.For
Delete, the final target is first located, e.g. by callingrealpath, and that is then deleted.edits:
IsSymbolicLinkfrom Proposed API for symbolic links #24271followLinktofollowLinks.Deletetarget based.Deleteto be path based again.MoveTounder path-based