我试图让它工作,但我似乎从来没有运气,我去一个博客的代码片段,仍然没有骰子.这是代码.
EXEC sp_configure filestream_access_level, 1
GO
RECONFIGURE
GO
CREATE DATABASE NorthPole
ON
PRIMARY (
NAME = NorthPoleDB,
FILENAME = 'C:\Temp\NP\NorthPoleDB.mdf'
), FILEGROUP NorthPoleFS CONTAINS FILESTREAM(
NAME = NorthPoleFS,
FILENAME = 'C:\Temp\NP\NorthPoleFS')
LOG ON (
NAME = NorthPoleLOG,
FILENAME = 'C:\Temp\NP\NorthPoleLOG.ldf')
GO
Run Code Online (Sandbox Code Playgroud) 在下面的代码示例中,文件流和流读取器是否会被丢弃或者它们是否会产生内存泄漏?是否可以编写此功能而不会导致内存泄漏?
string ReadFile(string strPath)
{
using (FileStream fstream = new FileStream(strPath, FileMode.Open))
{
using (StreamReader sreader = new StreamReader(fstream))
{
return sreader.ReadToEnd().ToString(); //NOTE ITS RETURNED HERE...SO CAN IT GET DISPOSED AFTER THIS LINE?
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在尝试编写一个将文件从一个位置复制到另一个位置并报告进度的类.我遇到的问题是,当应用程序运行时,进度将立即从0到100%拍摄,但文件仍在后台复制.
public void Copy(string sourceFile, string destinationFile)
{
_stopWatch.Start();
_sourceStream = new FileStream(srcName, FileMode.Open);
_destinationStream = new FileStream(destName, FileMode.CreateNew);
read();
//On a 500mb file, execution will reach here in about a second.
}
private void read()
{
int i = _sourceStream.Read(_buffer, 0, bufferSize);
_completedBytes += i;
if (i != 0)
{
_destinationStream.Write(_buffer, 0, i);
TriggerProgressUpdate();
read();
}
}
private void TriggerProgressUpdate()
{
if (OnCopyProgress != null)
{
CopyProgressEventArgs arg = new CopyProgressEventArgs();
arg.CompleteBytes = _completedBytes;
if (_totalBytes == 0)
_totalBytes …Run Code Online (Sandbox Code Playgroud) 我有这个资源文件,我需要处理,包含一组文件.
首先,资源文件列出了其中包含的所有文件,以及其他一些数据,例如在此结构中:
struct FileEntry{
byte Value1;
char Filename[12];
byte Value2;
byte FileOffset[3];
float whatever;
}
Run Code Online (Sandbox Code Playgroud)
所以我需要读取这个大小的块.
我正在使用FileStream中的Read函数,但是如何指定struct的大小?我用了:
int sizeToRead = Marshal.SizeOf(typeof(Header));
Run Code Online (Sandbox Code Playgroud)
然后将此值传递给Read,但之后我只能读取一组byte [],我不知道如何转换为指定的值(我知道如何获取单字节值...但不是其余的).
另外我需要指定一个不安全的上下文,我不知道它是否正确......
在我看来,读取字节流比我在.NET中认为的更难:)
谢谢!
我有一个程序,需要多个文件作为输入.我想要做的是使用相同的文件流?尝试使用第二个文件打开流时,我一直收到错误.为什么代码无效并在编译时创建错误?argv [2]是一个const char*.
错误:无法匹配调用'(std :: ifstream)(char*&)'
ifstream fin(argv[1]);
//work with filestream
fin.close();
fin(argv[2]);
//work with filestream
fin.close();
Run Code Online (Sandbox Code Playgroud) public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader br1 = null;
try {
br1= new BufferedReader(new FileReader(new File("D:\\Users\\qding\\Desktop\\spy.log")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str1;
try {
while((str1 = br1.readLine()) != null){
str1 = br1.readLine();
System.out.println(str1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
br1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
文件内容有九行,但结果只显示偶数行内容,最后一行显示为空.那么为什么这个方法只读取文件的偶数行?这么奇怪....
fileStream在调用Close方法之前,对象是否有可能被销毁?
FileStream fileStream = new FileStream(xxx);
StreamReader txtReader = new StreamReader(fileStream);
curLog = txtReader.ReadToEnd();
txtReader.Close();
fileStream.Close();
Run Code Online (Sandbox Code Playgroud) 在我的一生中,我一直无法找到与我想做的事情相匹配的问题,因此在这里我将解释我的用例。如果您知道某个主题已经涵盖了此问题的答案,请随时将我引向该主题。:)
我有一段代码可以定期(每20秒)将文件上传到Amazon S3。该文件是由另一个进程写入的日志文件,因此此功能实际上是尾随日志的一种方式,以便某人可以半实时读取其内容,而不必直接访问日志所在的计算机。 。
直到最近,我只是一直使用S3 PutObject方法(使用File作为输入)来执行此上传。但是在AWS开发工具包1.9中,这不再起作用,因为如果实际上传的内容大小大于上传开始时承诺的内容长度,则S3客户端会拒绝该请求。此方法在开始流传输数据之前先读取文件的大小,因此,鉴于此应用程序的性质,文件很可能在该点与流的末尾之间已增大。这意味着无论文件有多大,我现在都必须确保仅发送N个字节的数据。
我不需要以任何方式解释文件中的字节,因此我不关心编码。我可以逐字节传输它。基本上,我想要的是一种简单的方法,在该方法中,我可以读取文件的第N个字节,然后使文件终止读取,即使该点之后文件中有更多数据也是如此。(换句话说,将EOF插入流中的特定位置。)
例如,如果开始上载时我的文件长为10000字节,但是在上载期间增长到12000字节,则无论大小更改如何,我都希望以10000字节停止上载。(在随后的上传中,我然后将上传12000字节或更多。)
我尚未找到执行此操作的预制方法-到目前为止,我发现最好的方法似乎是IOUtils.copyLarge(InputStream,OutputStream,offset,length),可以告诉它复制最大的“长度”提供的OutputStream的字节数。但是,copyLarge和BlockObject一样都是阻塞方法(大概在InputStream上调用read()的形式),因此看来我根本无法使它正常工作。
我还没有找到任何可以执行此操作的方法或预构建的流,因此让我认为我需要编写自己的实现来直接监视已读取的字节数。然后,这可能像BufferedInputStream一样工作,其中每批读取的字节数是缓冲区大小或要读取的剩余字节中的较小者。(例如,在缓冲区大小为3000字节的情况下,我将进行三批处理,每批处理3000字节,然后再批处理1000字节+ EOF。)
有人知道更好的方法吗?谢谢。
编辑为了澄清一下,我已经知道了几种替代方法,但都不是理想的:
(1)我可以在上传文件时锁定它。这样做会导致数据丢失或写入文件的过程中的操作问题。
(2)我可以在上传文件之前创建文件的本地副本。这可能是非常低效的,并且会占用大量不必要的磁盘空间(此文件可能会扩展到几GB的范围,并且正在运行的计算机可能缺少磁盘空间)。
编辑2:根据同事的建议,我的最终解决方案如下所示:
private void uploadLogFile(final File logFile) {
if (logFile.exists()) {
long byteLength = logFile.length();
try (
FileInputStream fileStream = new FileInputStream(logFile);
InputStream limitStream = ByteStreams.limit(fileStream, byteLength);
) {
ObjectMetadata md = new ObjectMetadata();
md.setContentLength(byteLength);
// Set other metadata as appropriate.
PutObjectRequest req = new PutObjectRequest(bucket, key, limitStream, md);
s3Client.putObject(req);
} // plus exception handling
}
}
Run Code Online (Sandbox Code Playgroud)
LimitInputStream是我的同事建议的,显然不知道它已被弃用。ByteStreams.limit是当前的番石榴替代品,它可以满足我的要求。感谢大家。
请建议我如何在AZURE SQL DB中存储pdf文件.
以上将要求我在Azure SQL DB上启用和配置FILESTREAM.
目前,当我运行Create Table查询时,我收到此错误:
消息40517,级别16,状态1,行28此版本的SQL Server不支持关键字或语句选项'file stream_on'.
CREATE TABLE [MyDocs](
[id] [int] IDENTITY(1,1) NOT NULL,
[DocId] [int] not null,
[DocFileDat] [varbinary](max) FILESTREAM NULL,
[DocFileType] [varchar](5) NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMRAY]
) ON [PRIMARY] FILESTREAM_ON [FilestreamGroup1]
Run Code Online (Sandbox Code Playgroud) 我想将二进制文件复制到剪贴板中,因此当用户右键单击屏幕时可以看到粘贴选项启用.软件正在很好地处理粘贴部分,我需要将文件复制到clpboard中.这是我第一次使用剪贴板我试过这段代码
Procedure CopyStreamToClipboard( fmt: Cardinal; S: TStream );
Var
hMem: THandle;
pMem: Pointer;
Begin
S.Position := 0;
hMem := GlobalAlloc( GHND or GMEM_DDESHARE, S.Size );
If hMem <> 0 Then Begin
pMem := GlobalLock( hMem );
If pMem <> Nil Then Begin
try
S.Read( pMem^, S.Size );
S.Position := 0;
finally
GlobalUnlock( hMem );
end;
Clipboard.Open;
try
Clipboard.SetAsHandle( fmt, hMem );
finally
Clipboard.Close;
end;
End { If }
Else Begin
GlobalFree( hMem );
OutOfMemoryError;
End;
End { If }
Else …Run Code Online (Sandbox Code Playgroud) filestream ×10
c# ×3
java ×2
.net ×1
argv ×1
c#-3.0 ×1
c++ ×1
clipboard ×1
delphi ×1
dispose ×1
function ×1
inputstream ×1
sql ×1
sql-server ×1
streamreader ×1
struct ×1