Могу ли я преобразовать объект Stream в объект FileInfo? - PullRequest
10 голосов
/ 17 марта 2010

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

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

Ответы [ 7 ]

7 голосов
/ 17 марта 2010

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

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

2 голосов
/ 17 марта 2010

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

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 голосов
/ 17 марта 2010

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

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

0 голосов
/ 14 февраля 2017

Да, вы можете

var excelPackage = new ExcelPackage();
excelPackage.Load(fileStream);
0 голосов
/ 17 марта 2010

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

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

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

0 голосов
/ 17 марта 2010

Как указано Fredrik Mörk, это невозможно, так как их преобразование по умолчанию недоступно для обоих типов и также не рекомендуется.

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

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

Вот как вы конвертируете

 CustomStream stream = new CustomStream();
 FileInfo fileInfo = stream.ConvertToFileInfo();
0 голосов
/ 17 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...