我今天遇到了一个愚蠢的问题:
在我的项目中我必须使用一个库(我无法替换),他的问题是我正在使用MemoryStream而不是经常保存到 HDD(因为文件很多,而且它们的大小很小,所以它很完美为MemoryStream)。问题是库 API 是围绕文件系统访问构建的 - 其中一个函数只接受文件的直接路径。
我如何仍然向该方法发送一个字符串(路径),从而在FileStream不实际接触硬盘的情况下创建一个新的?
例如“\MEMORY\myfile.bin”?
是否可以导出内存文件的位置路径?
我这样做的理由是基于我的 WinForms 应用程序以 Base64 编码的字符串格式检索的图像集合。我需要构建一些 HTML 并注入这些图像,以便它们可以在我的应用程序的 WebBrowser 控件中的嵌入页面上呈现。由于我们在这里谈论的是 HTML,因此我需要使用<IMG>标签来显示图像。这个元素需要接受一个“src”路径,这意味着我需要确定一种方法来导出每个内存图像的绝对/相对路径。
例如,我想知道是否可以在内存中获取一段数据,将其读入输出字符串流(作为二进制数据)并将其写入套接字以供客户端应用程序处理。
我在尝试此操作时遇到的问题如下:
例子:
char name[1024] = "Test";
std::ostringstream message (std::stringstream::out | std::stringstream::binary);
len = strlen(name);
message.write(reinterpret_cast<const char*>(&len), sizeof(int));
message.write(test, len*sizeof(char));
Run Code Online (Sandbox Code Playgroud)
我想将此字符串流写入套接字,其中包含所有数据,但问题是这样的:字符串流写入仅执行第一次,在本例中写入 4(字符串的长度),并且后续写入均不执行。我在这里错过了什么吗?
如果这不是最好的方法,那么实现这一目标的最佳方法是什么?这在一定程度上是为了减少缓存内存快照的文件 I/O。
提前致谢..
我正在 C# 中创建一个服务,该服务将由将处理和存储文件的 ASP.Net Web API 使用。
作为 Web API 的一部分,我将文件存储在MemoryStreams 中,然后将其传递给服务进行实际处理和存储。
该服务的一部分是为每个文件生成一个新的文件名。
所以这引出了我的问题,现在是否有可能找出文件的文件类型/扩展名,因为它位于 MemoryStream 中?
我正在开发一个应用程序
使用简单的 HTTP 网页(REST 方法)从我的本地计算机上传 Azure blob 存储上的 .CSV 文件
上传 .CSV 文件后,我获取流以更新我的数据库
.CSV 文件大约 30 MB,上传到 blob 需要 2 分钟,但读取流需要 30 分钟。你能提供输入来提高速度吗? 这是用于从文件中读取流的代码片段:https : //azure.microsoft.com/en-in/documentation/articles/storage-dotnet-how-to-use-blobs/
public string GetReadData(string filename)
{
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(System.Web.Configuration.WebConfigurationManager.AppSettings["StorageConnectionString"]);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference(System.Web.Configuration.WebConfigurationManager.AppSettings["BlobStorageContainerName"]);
// Retrieve reference to a blob named "filename"
CloudBlockBlob blockBlob2 = container.GetBlockBlobReference(filename);
string …Run Code Online (Sandbox Code Playgroud) 我正在制作一个程序,通过 TCP 以块的形式传输文件。现在,每次我在最后传输文件时似乎都没有写入,因此如果我尝试传输右下角的图片,则会出现故障。现在,我的第一个想法是,当我读取、传输和写入小于缓冲区长度的最终块时,我也写入了很多零。所以我尝试相应地更改最后一个缓冲区大小。然后我使用一个只写有 HELLO WORLD 的小文本文件进行了尝试,但是当我输入它,然后打开文件时,它是空的。
这是读取和发送代码,其中 range[0] 是第一部分, range[1 ] 是最后一部分:
byte[] buffer = new byte[DATA_BUFF_SIZE];
using (Stream input = File.OpenRead(file.Path))
{
Console.WriteLine("SENT PARTS # ");
for (int i = range[0]; i <= range[1]; i++)
{
Console.Write("PART " + i + ", ");
if (i == range[1])
{
buffer = new byte[input.Length - input.Position];
}
input.Position = i * DATA_BUFF_SIZE;
input.Read(buffer, 0, buffer.Length);
netStream.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("LENGTH = " + input.Length);
}
Run Code Online (Sandbox Code Playgroud)
这是接收和编写代码:
int …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Gzip 压缩来压缩 JSON 文件以发送到另一个位置。它每天需要处理 5,000 - 10,000 个文件,我不需要本地机器上的文件的压缩版本(它们实际上被传输到 AWS S3 进行长期存档)。
由于我不需要它们,我试图压缩到内存流,然后使用它写入 AWS,而不是将每个压缩到磁盘。每当我尝试这样做时,文件都会损坏(例如,当我在 7-Zip 中打开它们并尝试打开其中的 JSON 文件时,我收到“数据错误文件已损坏”)。
当我尝试将内存流写入本地文件时会发生同样的事情,所以我现在正在尝试解决这个问题。这是代码:
string[] files = Directory.GetFiles(@"C:\JSON_Logs");
foreach(string file in files)
{
FileInfo fileToCompress = new FileInfo(file);
using (FileStream originalFileStream = fileToCompress.OpenRead())
{
using (MemoryStream compressedMemStream = new MemoryStream())
{
using (GZipStream compressionStream = new GZipStream(compressedMemStream, CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
compressedMemStream.Seek(0, SeekOrigin.Begin);
FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz");
//Eventually this will be the AWS transfer, but that's not important here
compressedMemStream.WriteTo(compressedFileStream);
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试下载一个几百 MB 的 .gz 文件,并在 C# 中将其转换为一个很长的字符串。
using (var memstream = new MemoryStream(new WebClient().DownloadData(url)))
using (GZipStream gs = new GZipStream(memstream, CompressionMode.Decompress))
using (var outmemstream = new MemoryStream())
{
gs.CopyTo(outmemstream);
string t = Encoding.UTF8.GetString(outmemstream.ToArray());
Console.WriteLine(t);
}
Run Code Online (Sandbox Code Playgroud)
我的测试网址:https : //commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2017-47/segments/1510934803848.60/wat/CC-MAIN-20171117170336-20171117190302twarc0z.
memstream 的长度为 283063949。程序在它初始化的那一行停留了大约 15 秒,在此期间我的网络被破坏了,这是有道理的。
outmemstream 的长度只有 548。
写入命令行的是压缩文档的第一行。它们不是乱码。我不知道如何得到其余的。
我有以下代码,它使用名为 Aspose.Words 的第三方库:
SaveOptions saveOptions = SaveOptions.CreateSaveOptions(SaveFormat.Docx);
saveOptions.MemoryOptimization = true;
saveOptions.TempFolder = Path.GetTempPath();
var mm = new RecyclableMemoryStreamManager();
using (RecyclableMemoryStream ms = new RecyclableMemoryStream(mm))
{
doc.Save(ms, saveOptions);
return ms.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
我在using语句中遇到以下错误。
Mvc.ExceptionHandling.AbpExceptionFilter - 引发“System.OutOfMemoryException”类型的异常。
我无法在本地重现它(在处理过程中我的内存使用量可能增加了 200mb,因此它实际上并没有使用太多内存)。文件本身大小仅为 56MB。Aspose 告诉我它最多可以使用该数量的 10 倍......即使如此也应该没问题。我已更改服务计划以扩展到 14GB 内存。
我正在使用 RecyclableMemoryStreamManager 因为我已经尝试使用 MemoryStream 但没有成功。
我还能做些什么来解决这个我只在 Azure(开发和生产)中遇到的问题?Azure API是.net核心堆栈,具有64位平台。
提前致谢。
使用 MemoryStream 写入 PDF 时,ASP.Net Core 从 FileStreamResult 返回 500 服务器错误
公共异步任务<Stream> DownloadDocumentInfoAsPdfAsync(用户登录用户){
尝试 {
var conversionOptions = 新 ConversionOptions {
边距 = 新的 MarginSettings(20, 5.5, 10, 5.5),
};
//从byte[]创建新的MemoryStream
返回新的 MemoryStream(_htmlToPdfConverter.ConvertHtml(html, conversionOptions));
}
}
//从上面的函数返回FileStream。
公共异步任务 <IActionResult>GenerateReport([FromRoute] string info) {
var 结果 = wait _mediator.Send(query);
return File(结果, "application/pdf", "employee.pdf"); //这将通过 500 INTERNAL SERVER ERROR
}
memorystream ×10
c# ×7
filestream ×3
azure ×2
.net-3.5 ×1
api ×1
asp.net-core ×1
aspose.words ×1
c++ ×1
csv ×1
exception ×1
file-io ×1
filesystems ×1
gzip ×1
gzipstream ×1
stream ×1