Я могу преобразовать Потоковый объект в объект FileInfo?

Для конструктора ExcelPackage Вам нужен объект FileInfo. Я скорее использую некоторый потоковый объект (f.i. MemoryStream), потому что я не должен сохранить файл к самому серверу, но выставить его как FileStream так или иначе пользователю. Я не хочу к make-файлам, которые я должен удалить lateron из серверов, которые являются только там для генерации целей и никогда не используются снова. Кроме этого, иначе мне нужны также необходимые права для приложения/пользователя на каталоге/файле на сервере.

Таким образом, мой вопрос затем: Как я могу преобразовать потоковый объект в объект FileInfo.

10
задан Michael 17 March 2010 в 13:15
поделиться

6 ответов

Добавление следующего конструктора в ExcelPackage позволяет использовать Вместо этого стримы.

public ExcelPackage( Stream stream ) {
    _package = Package.Open( stream, FileMode.Create, FileAccess.ReadWrite );

    Uri uriDefaultContentType = new Uri( "/default.xml", UriKind.Relative );
    PackagePart partTemp = _package.CreatePart( uriDefaultContentType, "application/xml" );

    XmlDocument workbook = Workbook.WorkbookXml; 

    _package.CreateRelationship( Workbook.WorkbookUri, TargetMode.Internal, schemaRelationships + "/officeDocument" );

    _package.DeletePart( uriDefaultContentType );
}
2
ответ дан 4 December 2019 в 01:00
поделиться

Вы не можете преобразовать Stream как таковой в FileInfo ; они представляют собой совершенно разные вещи. Поток содержит данные, которые могут или не могут представлять файл на диске. С другой стороны, A FileInfo содержит метаданные о файле, которые могут существовать или не существовать.

Что вы можете сделать, так это записать содержимое Stream в файл на диске, создать FileInfo , указывающую на этот файл, и передать этот FileInfo конструктору.

7
ответ дан 4 December 2019 в 01:00
поделиться

Вы не можете этого сделать, вам нужно вывести поток памяти в файл и получить объект FileInfo для вновь созданного файла и передать его в ExcelPackage.

0
ответ дан 4 December 2019 в 01:00
поделиться

Класс FileInfo представляет собой простую оболочку вокруг пути к файлу на диске.
Невозможно завернуть поток памяти в FileInfo.

Однако можно загрузить исходный код и добавить конструктор, который принимает Stream. (Путь к файлу используется только в методе WriteDebugFile)

2
ответ дан 4 December 2019 в 01:00
поделиться

Если посмотреть на исходный код для ExcelPackage , он использует метод Package.Open в свойстве FullName объекта FileInfo . передается конструктору с FileMode.Open и FileAccess.ReadWrite , чтобы инициализировать объект Package .

Метод Package.Open также может напрямую принимать Stream .

При желании вы можете самостоятельно перегрузить конструктор ExcelPackage , чтобы принять параметр Stream , и просто вызвать Package.Open для этого Stream объект, который легко может быть, например, MemoryStream .

0
ответ дан 4 December 2019 в 01:00
поделиться

Как упоминал Фредрик Мёрк , это невозможно, поскольку их преобразование по умолчанию не доступно между обоими типами и также не рекомендуется.

Только для справки , вы можете предоставить свою собственную логику преобразования , реализовав интерфейс IConvertible . опять же неправильный подход в этом сценарии, но может быть полезен где-то еще.

class CustomStream : Stream, IConvertible
    {
        public FileInfo ConvertToFileInfo()
        {
            return new FileInfo("");
        }
    }

Вот как это преобразовать

 CustomStream stream = new CustomStream();
 FileInfo fileInfo = stream.ConvertToFileInfo();
-1
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: