很明显,泛型HashSet<T>类的搜索性能高于泛型List<T>类.只需将基于散列的密钥与线性方法进行比较即可List<T>.
但是,计算散列键本身可能需要一些CPU周期,因此对于少量项目,线性搜索可以是一个真正的替代HashSet<T>.
我的问题:收支平衡在哪里?
为了简化场景(并且公平),我们假设List<T>该类使用元素的Equals()方法来标识项目.
我最近一直在将各种位置的MP3转移到存储库中.我一直使用ID3标签构建新的文件名(谢谢,TagLib-Sharp!),我注意到我得到了一个System.NotSupportedException:
"不支持给定路径的格式."
这是通过产生任一File.Copy()或Directory.CreateDirectory().
没过多久就意识到我的文件名需要消毒.所以我做了一件显而易见的事:
public static string SanitizePath_(string path, char replaceChar)
{
string dir = Path.GetDirectoryName(path);
foreach (char c in Path.GetInvalidPathChars())
dir = dir.Replace(c, replaceChar);
string name = Path.GetFileName(path);
foreach (char c in Path.GetInvalidFileNameChars())
name = name.Replace(c, replaceChar);
return dir + name;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我继续得到例外.原来,':'不在集合中Path.GetInvalidPathChars(),因为它在路径根中有效.我认为这是有道理的 - 但这必须是一个非常普遍的问题.有没有人有一些消毒路径的短代码?最彻底的我已经想到了这一点,但感觉它可能是矫枉过正.
// replaces invalid characters with replaceChar
public static string SanitizePath(string path, char replaceChar)
{
// construct a list of characters that can't show up in filenames. …Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序中包含批处理文件重命名功能.用户可以键入目标文件名模式和(在替换模式中的一些通配符之后)我需要检查它是否是Windows下的合法文件名.我试过使用正则表达式,[a-zA-Z0-9_]+但它不包括来自各种语言的许多国家特定字符(例如变音符号等).做这种检查的最佳方法是什么?
System.IO命名空间中是否有一个检查文件名有效性的方法?
例如,C:\foo\bar将验证,:"~-*不会
或者有点棘手,X:\foo\bar会验证系统上是否有X:驱动器,否则不会.
我想我自己可以编写这样的方法,但我对内置的方法更感兴趣.
有没有办法在.Net中检查路径中的字符串是否包含无效字符?我知道我可以迭代Path.InvalidPathChars中的每个字符,看看我的String是否包含一个,但我更喜欢一个简单的,也许更正式的解决方案.
有吗?
我发现如果我只检查Get,我仍会得到一个例外
更新:
我发现GetInvalidPathChars不会覆盖每个无效的路径字符.GetInvalidFileNameChars还有5个,包括'?',我遇到过.我要改用它,我会报告它是否也证明是不合适的.
更新2:
GetInvalidFileNameChars绝对不是我想要的.它包含':',任何绝对路径将包含("C:\ whatever").我想我毕竟不得不使用GetInvalidPathChars,并添加'?' 以及任何其他导致我出现问题的角色.欢迎提供更好的解
我已经写了这个小方法来实现subj中的目标,但是,有更高效(更简单)的方法吗?我希望这可以帮助那些像我一样搜索这个的人.
var fileName = new System.Text.StringBuilder();
fileName.Append("*Bad/\ :, Filename,? ");
// get rid of invalid chars
while (fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) > -1)
{
fileName = fileName.Remove(fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()), 1);
}
Run Code Online (Sandbox Code Playgroud)
?
我有来自SQL Server数据库的nvarchar字段的数据通过EF3.5.此字符串用于创建文件名,需要删除无效字符并尝试以下选项,但它们都不起作用.请提出为什么这是一个可以理解的谜团?我做错了吗?
我浏览了本网站上的几乎所有相关问题..现在发布了来自其他类似问题的所有建议/答案的综合问题.
UPD:问题无关......所有这些选项都有效.所以将其发布到社区维基.
public static string CleanFileName1(string filename)
{
string file = filename;
file = string.Concat(file.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries));
if (file.Length > 250)
{
file = file.Substring(0, 250);
}
return file;
}
public static string CleanFileName2(string filename)
{
var builder = new StringBuilder();
var invalid = System.IO.Path.GetInvalidFileNameChars();
foreach (var cur in filename)
{
if (!invalid.Contains(cur))
{
builder.Append(cur);
}
}
return builder.ToString();
}
public static string CleanFileName3(string filename)
{
string regexSearch = string.Format("{0}{1}",
new string(System.IO.Path.GetInvalidFileNameChars()),
new string(System.IO.Path.GetInvalidPathChars()));
Regex r = new Regex(string.Format("[{0}]", …Run Code Online (Sandbox Code Playgroud) 我正在研究一个程序,它根据列的标题读取文件并保存它们.其中一些标题有文件名的非法字符,所以我写了这段代码来处理这些问题.
string headerfile = saveDir + "\\" + tVS.Nodes[r].Text.Replace("\"", "").Replace
("/","").Replace(":"," -").Replace(">","(Greater Than)") + ".csv";
Run Code Online (Sandbox Code Playgroud)
在没有4的情况下有没有更好的方法.Replace()呢?或者是否有某种内置的非法角色去除器,我不知道?
谢谢!
编辑:它不需要用任何特定的字符替换字符.一个空白就足够了.
我们在我们的Web服务器(人们上传它们)上存储了一堆奇怪的文档名称,这些文档名称包含空格,符号等各种字符.当我们生成这些文档的链接时,我们需要将它们转义,以便服务器可以通过以下方式查找文件:它在数据库中的原始名称.但是,在所有情况下,内置的.NET转义函数都不会正常工作.
拿文件Hello#There.docx:
UrlEncode 将正确处理:
HttpUtility.UrlEncode("Hello#There");
"Hello%23There"
Run Code Online (Sandbox Code Playgroud)
然而,UrlEncode将不处理Hello There.docx正确:
HttpUtility.UrlEncode("Hello There.docx");
"Hello+There.docx"
Run Code Online (Sandbox Code Playgroud)
该+符号仅对URL参数有效,而不对文档名称有效.有趣的是,这实际上适用于Visual Studio测试Web服务器,但不适用于IIS.
该UrlPathEncode函数适用于空格:
HttpUtility.UrlPathEncode("Hello There.docx");
"Hello%20There.docx"
Run Code Online (Sandbox Code Playgroud)
但是,它不会逃避其他角色,如#角色:
HttpUtility.UrlPathEncode("Hello#There.docx");
"Hello#There.docx"
Run Code Online (Sandbox Code Playgroud)
此链接无效,因为它#被解释为URL哈希,甚至从未到达服务器.
是否有.NET实用程序方法来转义文档名称中的所有非字母数字字符,或者我是否必须自己编写?
我正在使用以下代码创建AppDomain
String pa = @"C:\Users\user\AppData\Local\Temp\2\db5fjamk.xnl";
System.IO.Directory.CreateDirectory(pa);
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; //f:\projectpath\out\debug-i386-unittest\UnitTests
setup.ApplicationName = string.Concat(AppDomain.CurrentDomain.FriendlyName, DateTime.UtcNow.Ticks); //UnitTestAdapter: Running test636559691791186101
setup.DynamicBase = pa;
Evidence evidence = AppDomain.CurrentDomain.Evidence;
_Domain = AppDomain.CreateDomain(setup.ApplicationName, evidence, setup);
Run Code Online (Sandbox Code Playgroud)
但_Domain.DynamicDirectory属性不存在.https://msdn.microsoft.com/en-us/library/system.appdomain.dynamicdirectory(v=vs.110).aspx清楚地说明了使用AppDomainSetup.DynamicBase.
在vstest.console.exe中执行的原因可能会更改App Domains的行为.有工作吗?
c# ×8
.net ×4
file ×2
path ×2
string ×2
validation ×2
appdomain ×1
asp.net ×1
collections ×1
escaping ×1
filesystems ×1
hash ×1
html ×1
list ×1
performance ×1
sanitize ×1
windows ×1