Скопируйте FIlestream в новый поток с пустым файлом - PullRequest
0 голосов
/ 15 марта 2019

Я работаю над преобразованием некоторых файлов, но у меня возникают некоторые проблемы на 2-м шаге этого.

  1. Загрузить файл из исходного местоположения
  2. Сохранить файл во временную папку
  3. Сохранить преобразованный файл в папку вывода

У меня есть 2 метода для чтения исходного файла, но есть проблема с ними обоими.

  • Способ 1: файл остается заблокированным (поэтому, когда что-то идет не так, я должен перезапустить приложение)
  • Способ 2: временный файл пуст

У кого-нибудь есть идеи, как решить одну из этих проблем?

Утилита класса

/// <summary>
/// Get document stream
/// </summary>
/// <param name="DocumentName">Input document name</param> 
public static Stream GetDocumentStreamFromLocation(string documentLocation)
{
    try
    {
        //ExStart:GetDocumentStream

        // Method one: works, but locks file
        return File.Open(documentLocation, FileMode.Open, FileAccess.Read);

        // Method two: gives empty file on temp folder
        using (FileStream fsSource = File.Open(documentLocation, FileMode.Open, FileAccess.Read))
        {
            var stream = new MemoryStream((int)fsSource.Length);
            fsSource.CopyTo(stream);

            return stream;
        }
        //ExEnd:GetDocumentStream
    }
    catch (FileNotFoundException ioEx)
    {
        Console.WriteLine(ioEx.Message);
        return null;
    }
}

/// <summary>
/// Save file in any format
/// </summary>
/// <param name="filename">Save as provided string</param>
/// <param name="content">Stream as content of a file</param>
public static void SaveFile(string filename, Stream content, string location = OUTPUT_PATH)
{
    try
    {
        //ExStart:SaveAnyFile
        //Create file stream
        using (FileStream fileStream = File.Create(Path.Combine(Path.GetFullPath(location), filename)))
        {

            content.CopyTo(fileStream);

        }
        //ExEnd:SaveAnyFile
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Вызываю следующие функции следующим образом:

public static StreamContent Generate(string sourceLocation)
{
    // Get filename
    var fileName = Path.GetFileName(sourceLocation);
    // Create tempfilename
    var tempFilename = $"{Guid.NewGuid()}_{fileName}";

    // Put file in storage location
    Utilities.SaveFile(tempFilename, Utilities.GetDocumentStreamFromLocation(sourceLocation), Utilities.STORAGE_PATH);

    // ... More code
}

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

После дальнейших раскопок.Я обнаружил, что вы можете добавить свойство в File.Open, которое «исправляет» эту проблему:

return File.Open(documentLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

С недостатком, который вы все еще не можете переместить / переименовать файл, но замок снят.

0 голосов
/ 15 марта 2019

Чтобы скопировать исходный файл во временную папку, проще всего использовать метод File.Copy из пространства имен System.IO.Учтите следующее:

// Assuming the variables have been set as you already had, this creates a copy in the intended location.
File.Copy(documentLocation, filename);
...