11// Lucene version compatibility level 4.8.1
22using System ;
33using System . IO ;
4+ #nullable enable
45
56namespace Lucene . Net . Analysis . Util
67{
@@ -38,7 +39,7 @@ namespace Lucene.Net.Analysis.Util
3839 /// </summary>
3940 public sealed class FilesystemResourceLoader : IResourceLoader
4041 {
41- private readonly DirectoryInfo baseDirectory ;
42+ private readonly string ? baseDirectory ; // LUCENENET specific: changed to use string directory name instead of allocating a DirectoryInfo (#832)
4243 private readonly IResourceLoader @delegate ;
4344
4445 /// <summary>
@@ -47,7 +48,7 @@ public sealed class FilesystemResourceLoader : IResourceLoader
4748 /// are delegated to context classloader.
4849 /// </summary>
4950 public FilesystemResourceLoader ( )
50- : this ( ( DirectoryInfo ) null )
51+ : this ( ( string ? ) null )
5152 {
5253 }
5354
@@ -57,22 +58,44 @@ public FilesystemResourceLoader()
5758 /// Files not found in file system and class lookups are delegated to context
5859 /// classloader.
5960 /// </summary>
60- public FilesystemResourceLoader ( DirectoryInfo baseDirectory )
61+ public FilesystemResourceLoader ( string ? baseDirectory )
6162 : this ( baseDirectory , new ClasspathResourceLoader ( typeof ( FilesystemResourceLoader ) ) )
6263 {
6364 }
6465
66+ /// <summary>
67+ /// Creates a resource loader that resolves resources against the given
68+ /// base directory (may be <c>null</c> to refer to CWD).
69+ /// Files not found in file system and class lookups are delegated to context
70+ /// classloader.
71+ /// </summary>
72+ public FilesystemResourceLoader ( DirectoryInfo ? baseDirectory )
73+ : this ( baseDirectory ? . FullName , new ClasspathResourceLoader ( typeof ( FilesystemResourceLoader ) ) )
74+ {
75+ }
76+
77+ /// <summary>
78+ /// Creates a resource loader that resolves resources against the given
79+ /// base directory (may be <c>null</c> to refer to CWD).
80+ /// Files not found in file system and class lookups are delegated
81+ /// to the given delegate <see cref="IResourceLoader"/>.
82+ /// </summary>
83+ public FilesystemResourceLoader ( DirectoryInfo ? baseDirectory , IResourceLoader @delegate )
84+ : this ( baseDirectory ? . FullName , @delegate )
85+ {
86+ }
87+
6588 /// <summary>
6689 /// Creates a resource loader that resolves resources against the given
6790 /// base directory (may be <c>null</c> to refer to CWD).
6891 /// Files not found in file system and class lookups are delegated
6992 /// to the given delegate <see cref="IResourceLoader"/>.
7093 /// </summary>
71- public FilesystemResourceLoader ( DirectoryInfo baseDirectory , IResourceLoader @delegate )
94+ public FilesystemResourceLoader ( string ? baseDirectory , IResourceLoader @delegate )
7295 {
7396 // LUCENENET NOTE: If you call DirectoryInfo.Create() it doesn't set the DirectoryInfo.Exists
7497 // flag to true, so we use the Directory object to check the path explicitly.
75- if ( baseDirectory is not null && ! Directory . Exists ( baseDirectory . FullName ) )
98+ if ( baseDirectory is not null && ! Directory . Exists ( baseDirectory ) )
7699 {
77100 throw new ArgumentException ( "baseDirectory is not a directory or is null" ) ;
78101 }
@@ -89,35 +112,35 @@ public Stream OpenResource(string resource)
89112 {
90113 try
91114 {
92- FileInfo file = null ;
115+ string ? file = null ; // LUCENENET specific: changed to use string file name instead of allocating a FileInfo (#832)
93116
94117 // First try absolute.
95118 if ( File . Exists ( resource ) )
96119 {
97- file = new FileInfo ( resource ) ;
120+ file = resource ;
98121 }
99122 else
100123 {
101124 // Try as a relative path
102125 var fullPath = System . IO . Path . GetFullPath ( resource ) ;
103126 if ( File . Exists ( fullPath ) )
104127 {
105- file = new FileInfo ( fullPath ) ;
128+ file = fullPath ;
106129 }
107130 else if ( baseDirectory != null )
108131 {
109132 // Try to combine with the base directory
110- string based = System . IO . Path . Combine ( baseDirectory . FullName , resource ) ;
133+ string based = System . IO . Path . Combine ( baseDirectory , resource ) ;
111134 if ( File . Exists ( based ) )
112135 {
113- file = new FileInfo ( based ) ;
136+ file = based ;
114137 }
115138 }
116139 }
117140
118141 if ( file != null )
119142 {
120- return file . OpenRead ( ) ;
143+ return new FileStream ( file , FileMode . Open , FileAccess . Read , FileShare . Read ) ;
121144 }
122145
123146 // Fallback on the inner resource loader (this could fail)
0 commit comments