В моем сценарии у меня есть сценарий использования, когда я должен получить сжатый файл, выполнить некоторые проверки и затем найти указанный файл c в архиве, который мне придется обрабатывать через стороннюю библиотеку. У меня возникли проблемы с получением такой библиотеки для чтения файла, хотя. Это то, что я придумал до сих пор:
public async Task ShapeIt(ZipArchive archive)
{
foreach (var entry in archive.Entries)
{
if (Path.GetExtension(entry.FullName).Equals(".shp"))
{
var stream = entry.Open();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
ms.Position = 0;
var fileName = Path.GetTempFileName();
try
{
using var fileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.Write,
FileShare.ReadWrite);
var bytes = new byte[ms.Length];
ms.Read(bytes, 0, (int)ms.Length);
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Flush();
fileStream.Close();
var featureSource = new ShapeFileFeatureSource(fileName); // Class from 3rd-party
featureSource.Open();
// Do my stuff with the shapefile
}
finally
{
File.Delete(fileName);
}
}
}
}
Обратите внимание, что я использую «старый способ» копирования потоков, поскольку Stream.CopyTo
и Stream.CopyToAsync
создавали пустые файлы, явно вызывая fileStream.Close()
выглядит как единственный способ вставить байты в файл каким-то образом, но это не моя точка зрения. Независимо от того, после закрытия потока , после вызова featureSource.Open()
мое приложение выбрасывает
"The process cannot access the file 'C:\\Users\\me\\AppData\\Local\\Temp\\tmpE926.tmp' because it is
being used by another process."
tmpE926.tmp
каждый раз, очевидно, очевидно. Также обратите внимание, что я создаю файл, потому что конструктор для ShapeFileFeatureSource
требует не потока, не байтового массива, а пути.
Гораздо более короткая реализация
public async Task ShapeIt(ZipArchive archive)
{
foreach (var entry in archive.Entries)
{
var tempFile = Path.GetTempFileName();
try
{
entry.ExtractToFile(tempFile, true);
if (Path.GetExtension(entry.FullName).Equals(".shp"))
{
var featureSource = new ShapeFileFeatureSource(tempFile);
featureSource.Open();
var type = featureSource.GetShapeFileType();
}
}
finally
{
File.Delete(tempFile);
}
}
}
фактически приведет к той же ошибке. Я, честно говоря, не думаю, что проблема заключается в этой библиотеке, скорее я как-то облажался. У кого-нибудь есть какие-либо идеи или мне следует обратиться в службу поддержки поставщика (без ответа)?
Редактировать: На всякий случай, это такая библиотека Install-Package ThinkGeo.UI.WebApi
, но для ее использования необходимо подписаться на оценку, чтобы ее использовать.