如何解析要解释为路径的命令行参数?args []包含在引用时自动连接的字符串,例如:
example.exe一二"三四"
args[0] = one
args[1] = two
args[2] = three four
Run Code Online (Sandbox Code Playgroud)
但是,args []不会将属性解析为"C:\ Example \"作为参数.相反,它将提供参数为"C:\ Example""(包含额外的引用.)这是由于路径中的反斜杠被视为转义字符,因此用户在命令上提供的结束引用-line成为论证的一部分.
.例如:
example.exe一个"C:\ InputFolder""C:\ OutuptFolder \"
args[0] = one
args[1] = C:\InputFolder"
args[2] = C:\OutputFolder"
Run Code Online (Sandbox Code Playgroud)
一个简单的kludge可能是:
_path = args[i].Replace("\"", @"\");
Run Code Online (Sandbox Code Playgroud)
但是,我确信这是最好的做法.如何正确解析一个包含路径的命令行,防止args []数组被不正确地填充已被解析为转义字符的stings?
注意:我不想在我的项目中包含整个命令行解析库!我只需要处理引用的路径,并希望以"手动"的方式这样做.请不要推荐NConsoler,Mono或任何其他大型"厨房水槽"命令行解析库.
另请注意:据我所知,这不是一个重复的问题.虽然其他问题集中在通用命令行解析上,但这个问题特定于当路径的一部分被解释为转义序列时路径引入的问题.
将命令行工具实现和构建为C#控制台应用程序的正确方法是什么?
需要解决的问题包括正确解析命令行变量以及输出文本的正确方法.虽然Console.WriteLine()是输出最明显的选择,但是应该选择写入标准错误流,.Error,.SetErrorStream等的情况是什么?
在将正确的返回代码返回给调用命令时,应用程序退出的正确方法是什么?
如何实现CancelKeyPress事件来中断程序?它是否仅在单独线程上发生异步操作时使用?
是否有一个简明的C#命令行工具编程指南,或者更好的开源项目或模板,我可以使用它来正确实现一个相对简单的工具?
在搜索SO以获取与业务规则验证相关的错误处理方法时,我遇到的只是结构化异常处理的示例.
MSDN和许多其他声誉良好的开发资源非常明确,不能使用异常来处理常规错误情况. 它们仅用于特殊情况和程序员(而不是用户)不当使用时可能发生的意外错误.在许多情况下,用户错误(例如空白的字段)很常见,我们程序应该这样做期待,因此不是例外,也不是使用例外的候选人.
引用:
请记住,在编程中使用术语例外与认为异常应该代表异常条件的想法有关.特殊情况,就其本质而言,通常不会发生; 因此,您的代码不应该将异常作为其日常操作的一部分.
不要抛出异常来表示常见事件.考虑使用备用方法向调用者传达这些事件的发生,并在真正与众不同的事件发生时抛出异常.
例如,正确使用:
private void DoSomething(string requiredParameter)
{
if (requiredParameter == null) throw new ArgumentExpcetion("requiredParameter cannot be null");
// Remainder of method body...
}
Run Code Online (Sandbox Code Playgroud)
使用不当:
// Renames item to a name supplied by the user. Name must begin with an "F".
public void RenameItem(string newName)
{
// Items must have names that begin with "F"
if (!newName.StartsWith("F")) throw new RenameException("New name must begin with /"F/""); …Run Code Online (Sandbox Code Playgroud) 如何轻松遍历TreeView中的所有节点,检查其.Checked属性,然后删除所有已检查的节点?
它似乎很简单,但你不应该修改你正在迭代的集合,从而消除了"foreach"循环的可能性.(.Nodes.Remove调用正在修改集合.)如果尝试这样做,效果是只有大约一半的.Checked节点被删除.
即使一个人使用两个传递:首先创建一个临时索引列表,然后在第二次传递时通过索引删除 - 每次删除时索引都会改变,从而使索引列表的完整性无效.
那么,最有效的方法是什么?
下面是一个看起来不错的代码示例,但实际上只删除了大约一半的.Checked节点:
foreach (TreeNode parent in treeView.Nodes)
{
if (parent.Checked)
{
treeView.Nodes.Remove(parent);
}
else
{
foreach (TreeNode child in parent.Nodes)
{
if (child.Checked) parent.Nodes.Remove(child);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(是的,目的只是从两层深度的树中修剪节点.)
维护源代码存储库的最佳实践是什么(自动(或至少默认情况下)拒绝包含/ bin,/ obj,*.suo等文件?
是否应要求每个开发人员为其SVN客户端安装设置"全局忽略"模式列表?[ 这似乎过于宽泛了.]
或者,源存储库维护者是否应使用SVN标记每个违规文件和目录:exclude?[ 这似乎太费时间了.]
或者,还有另一种方法吗?是否可以使用SVN创建特定于文件夹级别的忽略列表?
在GDI +中有一个首选的,快速的用户控件滚动方法吗?
我创建了一个控件,以图形方式呈现水平可滚动的数据图.
目前,我的控件通过将水平滚动条的位置转换为数据的偏移来进行操作.然后,控件呈现基于控件宽度计算的该起点和终点之间存在的数据.
这种方法有效,但速度很慢.我不希望在每次滚动事件时手动重绘整个控制界面.相反,我想通过将图形数据的整体(或部分)绘制到屏幕外表面来初始化控件,然后通过使控件表面从偏移处开始读取预渲染图形数据来虚拟滚动控件表面.由水平滚动条的位置计算.
BitBlt是唯一的方法吗?我是否真的必须手动将图形数据从一个表面复制到另一个表面?我不能只接管Paint事件并使其在渲染时从屏幕外表面读取数据吗?这样,复制和渲染操作就是同一个.
或者,我应该直接向Panel控件执行某些操作,然后直接从左到右滚动面板本身?
澄清:基本上,我想知道滚动预渲染数据的正确方法.如何在控件中滚动图形数据?重绘预渲染图形不是正确的选择.
什么会导致TreeView崩溃,除了调用TreeNode上的.Collapse()方法或TreeView的.CollapseAll()方法?
在我正在开发的应用程序中,TreeView将无法正常运行.TreeView仅维护两个级别.选择父节点的子节点时,所有其他节点立即崩溃.但是,我的代码中没有.Collapse()或.CollapseAll()方法调用!
除了.LabelEdit属性(设置为true)之外,TreeView的所有属性都保留其默认值.对于简单的验证/ MessageBox例程,TreeView在AfterLabelEdit事件中有一些相关的代码.
我试过了:
挂钩TreeView的BeforeCollapse事件并引发e.CancelAction标志.
手动扩展TreeView的AfterSelect事件中的所有节点.(这可以作为一个实验,但我不打算
完全禁止节点崩溃!)
在代码中的许多点上,我逐个节点地迭代TreeView来检查属性.但是,不会发生节点的添加或删除.用户进行选择时修改的唯一TreeNode属性是.ImageIndex和.SelectedImageIndex.
除了上面的两个解决方案,我没有任何线索可能导致此错误.即使没有任何解决方案可以实现,也许任何人都有关于正确处理崩溃的正确方法的想法?(我已尝试在BeforeCollapse事件中设置断点,但除非用户通过鼠标或键盘明确地折叠节点,否则不会触发断点.)
更新:
问题是由于在任何TreeNode上查找.SelectedImageIndex属性.更改此属性会导致所有其他节点崩溃.
我试图用.BeginUpdate()和.EndUpdate()调用无法使用.SelectedImageIndex属性修改代码.
如何避免这种情况?
假设解决方案只包含类,并且这些类都写入.NET 2.0规范.如果要在Visual Studio 2008中打开,转换和保存该解决方案,是否可以稍后在Visual Studio 2005中重新打开解决方案,并对.SLN文件进行一些最小的修改?
怎么会这样做呢?
如果解决方案中包含的所有类都已写入.NET 2.0规范,是否有一个工具可以从2008年到2005年"转换".SLN文件?
我一直在开发一份包含两个表格的SSRS 2005报告(一份套用信函).第一个"表"使用DataSet"A"填充信头上的地址字段.
第二个表使用DataSet"B"来显示与被寻址方有关的基本记录列表.
即使两个表位于同一页面中且所有PageBreak*属性都设置为"False",SSRS也会将报告呈现为两页.
如何强制两个表串联呈现,没有任何分页符?
我错过了什么吗,在这里?您不应该在同一页面上的单个报告中包含两个表吗?