我有一段代码需要使用UNC路径从NAS服务器打开和读取大量小文本文件.此代码是最初用C++编写但现在转换为C#的模块的一部分.C#版本明显变慢了.我确定打开文件的调用几乎占据了所有的性能差异.使用WireShark我发现这是因为System.IO.File.Open调用比类似的C++代码产生更多的SMB网络请求.
C++代码进行此调用:
FILE *f = _wfsopen(fileName, L"r", _SH_DENYWR);
Run Code Online (Sandbox Code Playgroud)
这导致以下SMB请求序列:
NT Create AndX Request, FID: 0x0004, Path: \\a\\i\\a\\q\\~141106162638847.nmd
NT Create AndX Response, FID: 0x0004
Trans2 Request, QUERY_FILE_INFO, FID: 0x0004, Query File Basic Info
Trans2 Response, FID: 0x0004, QUERY_FILE_INFO
Read AndX Request, FID: 0x0004, 1327 bytes at offset 0
Read AndX Response, FID: 0x0004, 1327 bytes
Close Request, FID: 0x0004
Close Response, FID: 0x0004
NT Create AndX Request, FID: 0x0005, Path: \\a\\i\\a\\q\\~141106162638847.nmd
NT Create AndX Response, FID: 0x0005
Run Code Online (Sandbox Code Playgroud)
C#代码进行此调用:
FileStream f = …
Run Code Online (Sandbox Code Playgroud) 我有一个网页,允许从浏览器外部拖动文件并将其放到我的网页上的目标上.我的应用程序将上传每个文件的副本,因此我将dataTransfer.dropEffect设置为"copy",以便浏览器向用户指示这将导致副本而不是移动.这在Chrome中正常运行:在我的放置目标上拖动文件时,浏览器会显示"复制"光标.但Firefox似乎忽略了dropEffect并继续显示其默认的"移动"光标,同时文件被拖放到我的放置目标上.我做了很多搜索,没有发现像这样的Firefox问题,所以我可能忽略了我的代码中的一些细节.我已经包含了一个简化示例,说明了下面的问题.如果有人能发现我做错了什么,请提前致谢.
<!DOCTYPE html>
<html>
<head>
<title>Test Stuff</title>
<style type="text/css">
P
{
background-color: #cccccc;
padding: 10px;
}
</style>
<script type="text/javascript">
function DocOnLoad() {
var target = document.getElementById('dropTarget');
target.addEventListener('dragenter', function (e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
});
target.addEventListener('dragover', function (e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
});
target.addEventListener('drop', function (e) {
e.preventDefault();
var files = e.dataTransfer.files;
alert(files[0].name);
});
}
</script>
</head>
<body onLoad="DocOnLoad()" >
<p id="dropTarget">Drop target.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我有一个程序打开一个大的二进制文件,向它添加少量数据,并关闭该文件.
FileStream fs = File.Open( "\\\\s1\\temp\\test.tmp", FileMode.Append, FileAccess.Write, FileShare.None );
fs.Write( data, 0, data.Length );
fs.Close();
Run Code Online (Sandbox Code Playgroud)
如果test.tmp在运行此程序之前为5MB且数据阵列为100字节,则此程序将导致超过5MB的数据通过网络传输.我原本以为文件中的数据不会通过网络传输,因为我没有读它或写它.有什么方法可以避免这种行为吗?这使得追加非常大的文件非常缓慢.