Esempio n. 1
0
 /// <summary>
 /// Copy settings from <paramref name="src"/>.
 /// </summary>
 /// <param name="src"></param>
 /// <returns></returns>
 public TempFileProviderOptions ReadFrom(TempFileProviderOptions src)
 {
     this.Directory = src.Directory;
     this.Prefix    = src.Prefix;
     this.Suffix    = src.Suffix;
     return(this);
 }
        /// <summary>
        /// Create temp file provider.
        /// </summary>
        /// <param name="options">(optional) options</param>
        public TempFileProvider(TempFileProviderOptions options = null)
        {
            this.handleDisposedFunc = HandleDisposed;

            if (options?.Directory == null && options?.Prefix == null && options?.Suffix == null)
            {
                // Use default function.
                directory      = Path.GetTempPath();
                createTempFile = Path.GetTempFileName;
            }
            else
            {
                // Read dir
                directory = options?.Directory;

                if (directory == null)
                {
                    // Get the default dir
                    directory = Path.GetTempPath();
                }
                else
                {
                    // Expand environment variables
                    if (directory != null)
                    {
                        directory = Environment.ExpandEnvironmentVariables(directory);
                    }

                    // Expand tmp if the line above didn't do that
                    if (directory != null && directory.Contains("%tmp%"))
                    {
                        directory = directory.Replace("%tmp%", Path.GetTempPath());
                    }

                    // Test if there are still unwrapped environment variables.
                    if (directory != null)
                    {
                        Match environmentVariables = EnvironmentVariablePattern.Match(directory);
                        if (environmentVariables.Success)
                        {
                            throw new ArgumentException($"{nameof(TempFileProviderOptions)}: could not expand all environment variables \"{environmentVariables.Groups[1].Value}\".");
                        }
                    }
                }

                // Create function that creates files using GUIDs
                prefix         = options?.Prefix ?? "";
                suffix         = options?.Suffix ?? "";
                createTempFile = () =>
                {
                    for (int i = 0; i < 100; i++)
                    {
                        Guid   guid     = Guid.NewGuid();
                        string filename = Path.Combine(directory, prefix + guid.ToString() + suffix);
                        if (File.Exists(filename))
                        {
                            continue;
                        }

                        try
                        {
                            // Try create file
                            using (var fs = new FileStream(filename, FileMode.CreateNew)) { }
                            return(filename);
                        }
                        catch (IOException)
                        {
                            // File existed, or create failed
                            continue;
                        }
                    }
                    throw new IOException($"Failed to create temp file in {directory}");
                };
            }
        }