﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-风人园-文章分类-DotNet</title><link>http://www.blogjava.net/wuxufeng8080/category/12854.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 12 Mar 2007 04:49:21 GMT</lastBuildDate><pubDate>Mon, 12 Mar 2007 04:49:21 GMT</pubDate><ttl>60</ttl><item><title>路径，文件，目录，I/O常见操作汇总</title><link>http://www.blogjava.net/wuxufeng8080/articles/102751.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 09 Mar 2007 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/102751.html</guid><description><![CDATA[
		<strong>摘要:<br /></strong>    文件操作是程序中非常基础和重要的内容，而路径、文件、目录以及I/O都是在进行文件操作时的常见主题，这里想把这些常见的问题作个总结，对于每个问题，尽量提供一些解决方案，即使没有你想要的答案，也希望能提供给你一点有益的思路，如果你有好的建议，恳请能够留言，使这些内容更加完善。 <br />    <span style="FONT-WEIGHT: bold">主要内容：<br /></span>    一、路径的相关操作， 如判断路径是否合法，路径类型，路径的特定部分，合并路径，系统文件夹路径等内容；<br />    二、相关通用文件对话框，这些对话框可以帮助我们操作文件系统中的文件和目录；<br />    三、文件、目录、驱动器的操作，如获取它们的基本信息，获取和设置文件和目录的属性，文件的版本信息，<br />        搜索文件和目录，文件判等，复制、移动、删除、重命名文件和目录；<br />    四、读写文件，包括临时文件，随机文件名等；<br />    五、对文件系统的监视； <br />    这一篇就先写一下前两部分。<br /><br />    <strong>一、路径相关操作</strong><br />    问题1：<span style="COLOR: #1f00fc">如何判定一个给定的路径是否有效/合法；</span><br />    解决方案：通过Path.GetInvalidPathChars或Path.GetInvalidFileNameChars方法获得非法的路径/文件名字符，可以<br />    根据它来判断路径中是否包含非法字符；<br /><br />    问题2：<span style="COLOR: #1f00fc">如何确定一个路径字符串是表示目录还是文件；<br />    </span>解决方案：<br />    1、使用Directory.Exists或File.Exist方法，如果前者为真，则路径表示目录；如果后者为真，则路径表示文件；<br />    2、上面的方法有个缺点就是不能处理那些不存在的文件或目录。这时可以考虑使用Path.GetFileName方法获得<br />       其包含的文件名，如果一个路径不为空，而文件名为空那么它表示目录，否则表示文件；<br /><br />    问题3：<span style="COLOR: #2000ff">如何获得路径的某个特定部分（如文件名、扩展名等）；</span><br />    解决方案：<br />    下面是几个相关方法：<br />    Path.GetDirectoryName ：返回指定路径字符串的目录信息；<br />    Path.GetExtension ： 返回指定的路径字符串的扩展名；<br />    Path.GetFileName ： 返回指定路径字符串的文件名和扩展名；<br />    Path.GetFileNameWithoutExtension ：返回不具有扩展名的路径字符串的文件名；<br />    Path.GetPathRoot ：获取指定路径的根目录信息；<br />    （更多内容还请参考MSDN）<br /><br />    问题4：<span style="COLOR: #2000ff">如何准确地合并两个路径而不用去担心那个烦人的”\”字符；</span><br />    解决方案：<br />    使用Path.Combine方法，它会帮你处理烦人的”\”； 
<p>    问题5：<span style="COLOR: #2000ff">如何获得系统目录的的路径（如桌面，我的文档，临时文件夹等）；</span><br />    解决方案：<br />    主要是使用System. Environment类的相关属性和方法：<br />    Environment. SystemDirectory属性：获取系统目录的完全限定路径；<br />    Environment. GetFolderPath方法：该方法接受的参数类型为Environment.SpecialFolder枚举，<br />    通过这个方法可以获得大量系统文件夹的路径，如我的电脑，我的电脑，桌面，系统目录等；<br />    （更多内容还请参考MSDN）；<br />    Path.GetTempPath方法：返回当前系统的临时文件夹的路径；</p><p>    问题6：<span style="COLOR: #2000ff">如何判断一个路径是绝对路径还是相对路径；</span><br />    解决方案：<br />    使用Path.IsPathRooted方法；</p><p>    问题7：<span style="COLOR: #2000ff">如何读取或设置当前目录；</span><br />    解决方案：<br />    使用Directory类的GetCurrentDirectory和SetCurrentDirectory方法；</p><p>    问题8：<span style="COLOR: #2000ff">如何使用相对路径；</span><br />    解决方案：<br />    设置当前目录后（见问题7），就可以使用相对路径了。对于一个相对路径，我们可以<br />    使用Path.GetFullPath方法获得它的完全限定路径（绝对路径）。</p><p>    注意：如果打算使用相对路径，建议你将工作目录设置为各个交互文件的共同起点，否则可能会引入<br />    一些不易发现的安全隐患，被恶意用户利用来访问系统文件。<br /><br />    更多内容：<br />    通常我们可以使用System.IO.Path类来处理路径。该类提供了一套方法和属性用于对包含文件或目录路径信息的字符串执行操作，这些操作是以跨平台的方式执行的，而这些方法和属性都是静态的。</p><p>    注意路径仅仅是提供文件或目录位置的字符串。路径不必指向磁盘上的位置，例如，路径可以映射到内存中或设备上的位置。路径的准确格式是由当前平台确定的。例如，在某些系统上，路径可以驱动器号或卷号开始，而此元素在其他系统中是不存在的。在某些系统上，文件路径可以包含扩展名，扩展名指示在文件中存储的信息的类型。文件扩展名的格式是与平台相关的；例如，某些系统将扩展名的长度限制为 3 个字符，而其他系统则没有这样的限制。当前平台还确定用于分隔路径中各元素的字符集，以及确定在指定路径时不能使用的字符集。因为这些差异，所以 Path 类的字段以及 Path 类的某些成员的准确行为是与平台相关的。</p><p>    路径可以包含绝对或相对位置信息。绝对路径完整指定一个位置：文件或目录可被唯一标识，而与当前位置无关。相对路径指定部分位置：当定位用相对路径指定的文件时，当前位置用作起始点。</p><p>    Path类的大多数成员不与文件系统交互，并且不验证路径字符串指定的文件是否存在。修改路径字符串的Path 类成员（例如 ChangeExtension）对文件系统中文件的名称没有影响。但Path成员确实验证指定路径字符串的内容；并且如果字符串包含在路径字符串中无效的字符（如 InvalidPathChars 中的定义），则引发 ArgumentException异常。例如，在基于 Windows 的桌面平台上，无效路径字符可能包括引号 (")、小于号 (&lt;)、大于号 (&gt;)、管道符号 (|)、退格 (\b)、空 (\0) 以及从 16 到 18 和从 20 到 25的 Unicode 字符。</p><p>    Path 类的成员使您可以快速方便地执行常见操作，例如确定文件扩展名是否是路径的一部分，以及将两个字符串组合成一个路径名。</p>    多数情况下，如果这些方法接收了无效的路径会抛出异常，但如果路径名是因为包含了通配符（*或?）从而无效，则不会抛出异常（可以使用GetInvalidPathChars方法来非法的路径字符）。我们可以根据该原则判断一个路径是否合法。<br /><br />    <strong>二、相关的通用文件对话框</strong>    
<p>    1、<span style="COLOR: #2000ff">文件夹浏览对话框</span>（FolderBrowserDialog类）<br />    用户可以通过该对话框浏览、新建并选择文件夹，如下图：<br />    <img height="325" alt="" src="http://www.cnblogs.com/images/cnblogs_com/anderslly/FolderBrowserDialog.JPG" width="338" /><br /></p><p>    主要属性：<br />    Description：树视图控件上显示的说明文本，如上图中的”选择要进行计算的目录”；<br />    RootFolder：获取或设置从其开始浏览的根文件夹，如上图中设置的我的电脑（默认为桌面）；<br />    SelectedPath：获取或设置用户选定的路径，如果设置了该属性，打开对话框时会定位到指定路径，默认为根文件夹，关闭对话框时根据该属性获取用户用户选定的路径；<br />    ShowNewFolderButton：获取或设置是否显示新建对话框按钮；</p><p>    主要方法：<br />    ShowDialog：打开该对话框，返回值为DialogResult类型值，如果为DialogResult.OK，则可以由SelectedPath属性获取用户选定的路径；<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dlgOpenFolder.Description </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">选择要进行计算的目录</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFolder.RootFolder </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Environment.SpecialFolder.MyComputer;<br />    dlgOpenFolder.ShowNewFolderButton </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    DialogResult result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgOpenFolder.ShowDialog(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (result </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DialogResult.OK)<br />    {<br />        txtDirPath.Text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgOpenFolder.SelectedPath;<br />    }</span></div><p> </p><p>    2、<span style="COLOR: #2000ff">打开文件对话框</span>（OpenFileDialog类）<br />    用户可以通过该对话框选择一个文件，见下图：<br />    <img height="419" alt="" src="http://www.cnblogs.com/images/cnblogs_com/anderslly/OpenFileDialog.JPG" width="571" /><br /></p>    主要属性：<br />    CheckFileExists：该值指示如果用户指定不存在的文件名，对话框是否显示警告；<br />    FileName(s)：获取或设置一个包含在文件对话框中选定的文件名的字符串；<br />    Filter：获取或设置对话框的文件类型列表；<br />    FilterIndex：对话框的文件类型列表的索引（基于1的）；<br />    InitialDirectory：获取或设置文件对话框显示的初始目录；<br />    Multiselect：该值指示对话框是否允许选择多个文件；<br />    ShowReadOnly：该值指示对话框是否包含只读复选框；<br />    Title：获取或设置文件对话框标题；<br />    主要方法：<br />    OpenFile：打开用户选定的具有<span style="COLOR: #2000ff">只读</span>权限的文件；<br />    ShowDialog：打开该模式对话框； <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dlgOpenFile.Title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">打开源文件</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFile.InitialDirectory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">C:\Inetpub\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFile.Filter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFile.FilterIndex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />    dlgOpenFile.ShowReadOnly </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    DialogResult dr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgOpenFile.ShowDialog();<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (dr </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DialogResult.OK)<br />    {<br />        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName = dlgOpenFile.FileName;<br />    }</span></div><p>    3、<span style="COLOR: #2000ff">保存文件对话框</span>（SaveFileDialog类）<br />    用户可以通过该对话框保存一个文件，见下图：<br />    <img height="422" alt="" src="http://www.cnblogs.com/images/cnblogs_com/anderslly/SaveFileDialog.JPG" width="571" /><br /></p><p>    主要属性：<br />    大部分与打开文件对话框类似，此处略过，下面几个值得注意：<br />    CreatePrompt：该值指示如果用户指定不存在的文件，是否提示用户允许创建该文件；<br />    OverwritePrompt：该值指示如果用户指定的文件名已存在，对话框是否显示警告；<br />    主要方法：<br />    OpenFile：打开用户选定的具有读/写权限的文件；<br />    ShowDialog：打开该模式对话框；<br />    示例代码：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dlgSaveFile.Title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">打开目标文件</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgSaveFile.InitialDirectory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">C:\Inetpub\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgSaveFile.Filter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgSaveFile.FilterIndex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />    DialogResult dr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgSaveFile.ShowDialog();<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (dr </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DialogResult.OK)<br />    {<br />        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName = dlgSaveFile.FileName;<br />    }</span></div><br />    至此，我们操作的都只是路径，要知道，这些路径仅仅是字符串，还没有涉及到文件系统中的真实文件。下一篇中会详细了解有关文件和目录的相关操作。<br /><br /><strong><br /><br />摘要:<br /></strong>    文件操作是程序中非常基础和重要的内容，而路径、文件、目录以及I/O都是在进行文件操作时的常见主题，这里想把这些常见的问题作个总结，对于每个问题，尽量提供一些解决方案，即使没有你想要的答案，也希望能提供给你一点有益的思路，如果你有好的建议，恳请能够留言，使这些内容更加完善。 <br />    主要内容：<br />    一、路径的相关操作， 如判断路径是否合法，路径类型，路径的特定部分，合并路径，系统文件夹路径等内容；<br />    二、相关通用文件对话框，这些对话框可以帮助我们操作文件系统中的文件和目录；<br />    三、文件、目录、驱动器的操作，如获取它们的基本信息，获取和设置文件和目录的属性，文件的版本信息，<br />        搜索文件和目录，文件判等，复制、移动、删除、重命名文件和目录；<br />    四、读写文件，包括临时文件，随机文件名等；<br />    五、对文件系统的监视；<br /><br />    <a title="路径的相关操作" style="COLOR: #e210ff" href="http://www.cnblogs.com/anderslly/archive/2006/12/24/pathcommondialog.html" target="_blank">上一篇</a>介绍了第一、二部分，这一篇介绍一下最重要的第三部分。<br />    <br />    <span style="FONT-WEIGHT: bold">三、文件和目录相关操作</span><br />    文件和目录操作涉及的类主要是：FileInfo,DirectoryInfo,DriveInfo，可以认为它们的一个实例对应着一个文件、目录、驱动器。它们的用法类似，一般是将文件、目录或驱动器的路径作为参数传递给相应的构造函数创建一个实例，然后访问它们的属性和方法。<br />    注意下面几点：<br />    FileInfo 类和 DirectoryInfo 类都继承自抽象类 FileSystemInfo ， FileSystemInfo 类定义了一些通用的属性，如 CreationTime 、 Exists 等。但 DriveInfo 类没有继承 FileSystemInfo 类，所以它也就没有上面提到的那些通用属性了。<br /><br />    FileInfo 类和 DirectoryInfo 类的对象公开的属性值都是第一次查询时获取的值，如果在以此查询之后文件或目录发生了改动，就必须调用它们的 Refresh 方法来更新这些属性。但 DriveInfo 则无需这么做，它的属性每次都会读取文件系统最新的信息。<br /><br />    在创建文件、目录或驱动器的实例时，如果使用了一个不存在的路径，并不会报错，这是你得到一个对象，该对象表示一个并不存在的实体，这意味着它的 Exists 属性（对于 DriveInfo 来说是 IsReady 属性）值为 false 。你仍然可以操作该实体，但如果尝试其它的大多数属性，就会引发相应的 FileNotFoundException 、 DirectoryNotFoundException 或 DriveNotFoundException 异常。<br /><br />    另外，还可以使用 File / Directory 类，这两个类的成员都是静态方法，<span style="COLOR: #ff2074">所以如果只想执行一个操作</span>，那么使用 File/Directory 中的静态方法的效率比使用相应的 FileInfo / DirectoryInfo中的 实例方法可能更高。所有的 File / Directory 方法都要求当前所操作的文件 / 目录的路径。 注意： File / Directory 类的静态方法对所有方法都执行安全检查。<span style="COLOR: #ff2074">如果打算多次重用某个对象</span>，可考虑改用 FileInfo / DirectoryInfo 的相应实例方法，因为并不总是需要安全检查。   
<p>    下面是一些常见的问题：<br />    问题1：<span style="COLOR: #2000ff">如何获取指定文件的基本信息；</span><br />    解决方案：可以使用FileInfo类的相关属性：<br />    FileInfo.Exists：获取指定文件是否存在；<br />    FileInfo.Name，FileInfo.Extensioin：获取文件的名称和扩展名；<br />    FileInfo.FullName：获取文件的全限定名称（完整路径）；<br />    FileInfo.Directory：获取文件所在目录，返回类型为DirectoryInfo；<br />    FileInfo.DirectoryName：获取文件所在目录的路径（完整路径）；<br />    FileInfo.Length：获取文件的大小（字节数）；<br />    FileInfo.IsReadOnly：获取文件是否只读；<br />    FileInfo.Attributes：获取或设置指定文件的属性，返回类型为FileAttributes枚举，可以是多个值的组合（见问题2）；<br />    FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime：分别用于获取文件的创建时间、访问时间、修改时间；<br />    （更多内容还请参考MSDN）<br /></p><p>    问题2：<span style="COLOR: #2000ff">如何获取和设置文件的属性，比如只读、存档、隐藏等；</span><br />    解决方案：<br />    使用FileInfo.Attributes属性可以获取和设置文件的属性，该属性类型为FileAttributes枚举，该枚举的每个值表示一种属性，FileAttributes枚举具有属性（Attribute）FlagsAttribute，所以该枚举的值可以进行组合，也就是一个文件可以同时拥有多个属性。下面看看具体的做法：<br />    获取属性，比如判断一个文件是否是只读的：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 当文件具有其它属性时，这种做法会失败</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (file.Attributes </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> FileAttributes.ReadOnly)<br />    {<br />        chkReadonly.Checked </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    }<br /><br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 这种写法就不会有问题了，它只检查只读属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ((file.Attributes </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> FileAttributes.ReadOnly) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> FileAttributes.ReadOnly)<br />    {<br />        chkReadonly.Checked </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    }</span></div><br /><p>    设置属性，比如添加和移除一个文件的只读属性：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (chkReadonly.Checked)<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 添加只读属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        file.Attributes </span><span style="COLOR: #000000">|=</span><span style="COLOR: #000000"> FileAttributes.ReadOnly;<br />    }<br />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 移除只读属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        file.Attributes </span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">FileAttributes.ReadOnly;<br />    }</span></div><p>    问题3：<span style="COLOR: #2000ff">如何获取文件的版本信息（比如版本号，版权声明，公司名称等）；</span><br />    解决方案：<br />    使用FileVersionInfo类，该类有大量的版本信息相关的属性。通过它的静态方法GetVersionInfo获得该类的一个实例，然后就可以访问指定文件的版本信息了，非常方便。如FileVersion表示文件版本号，LegalCopyright表示指定文件的版权声明，CompanyName表示指定文件的公司名称。（更多内容还请参考MSDN）</p><p>    问题4：<span style="COLOR: #2000ff">如何判断两个文件的内容是否相同（精确匹配）；</span><br />    解决方案：<br />    使用System.security.Cryptography.HashAlgorithm类为每个文件生成一个哈希码，然后比较两个哈希码是否一致。<br />    在比较文件内容的时候可以采用好几种方法。例如，检查文件的某一特定部分是否一致；如果愿意，你甚至可以逐字节读取文件，逐字节进行比较。这两种方法都是可以的，但在某些情况下，还是使用哈希码算法更为方便。<br />    该算法为一个文件生成一个小的（通常约为20字节）二进制”指纹”（binary fingerprint）。从统计学角度看，不同的文件不可能生成相同的哈希码。事实上，即使是一个很小的改动（比如，修改了源文件中的一个bit），也会有50％的几率来改变哈希码中的每一个bit。因此，哈希码常常用于数据安全方面。<br />    要生成一个哈希码，你必须首先创建一个HashAlgorithm对象，而这通常是调用HashAlgorithm.Create方法来完成的；然后调用HashAlgorithm.ComputeHash方法，它会返回一个存储哈希码的字节数组。代码如下：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 判断两个文件内容是否一致<br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> IsFilesEqual(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName1, </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName2)<br />    {<br />        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (HashAlgorithm hashAlg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> HashAlgorithm.Create())<br />        {<br />            </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName1, FileMode.Open), fs2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName2, FileMode.Open))<br />            {<br />                </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashBytes1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hashAlg.ComputeHash(fs1);<br />                </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashBytes2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hashAlg.ComputeHash(fs2);<br /><br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 比较哈希码</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (BitConverter.ToString(hashBytes1) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> BitConverter.ToString(hashBytes2));<br />            }<br />        }<br />    }</span></div><br /><p>    问题5：<span style="COLOR: #2000ff">如何获取指定目录的基本信息；</span><br />    解决方案：可以使用DirectoryInfo类的相关属性和方法：<br />    DirectoryInfo.Exists：获取指定目录是否存在；<br />    DirectoryInfo.Name：获取目录的名称；<br />    DirectoryInfo.FullName：获取目录的全限定名称（完整路径）；<br />    DirectoryInfo.Attributes：获取或设置指定目录的属性，返回类型为FileAttributes枚举，可以是多个值的组合；   <br />    DirectoryInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime：分别用于获取目录的创建时间、访问时间、修改时间；<br />    DirectoryInfo.Parent：获取目录的上级目录，返回类型为DirectoryInfo；<br />    DirectoryInfo.Root：获取目录的根目录，返回类型为DirectoryInfo；<br /></p><p>    问题6：<span style="COLOR: #2000ff">如何获取指定目录包含的文件和子目录；</span><br />    解决方案：<br />    DirectoryInfo.GetFiles()：获取目录中（不包含子目录）的文件，返回类型为FileInfo[]，支持通配符查找；<br />    DirectoryInfo.GetDirectories()：获取目录（不包含子目录）的子目录，<br />        返回类型为DirectoryInfo[]，支持通配符查找；<br />    DirectoryInfo. GetFileSystemInfos()：获取指定目录下（不包含子目录）的文件和子目录，<br />        返回类型为FileSystemInfo[]，支持通配符查找；<br /></p><p>    问题7：<span style="COLOR: #2000ff">如何获得指定目录的大小；</span><br />    解决方案：<br />    检查目录内的所有文件，利用FileInfo.Length属性获取每个文件的大小，然后进行合计，然后使用递归算法处理所有的子目录的文件，参考下面代码：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 计算一个目录的大小<br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="di"&gt;</span><span style="COLOR: #008000">指定目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="includeSubDir"&gt;</span><span style="COLOR: #008000">是否</span><span style="COLOR: #008000">包含子目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> CalculateDirSize(DirectoryInfo di, </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> includeSubDir)<br />    {<br />        </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> totalSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 检查所有（直接）包含的文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        FileInfo[] files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> di.GetFiles();<br />        </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (FileInfo file </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> files)<br />        {<br />            totalSize </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> file.Length;<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 检查所有子目录，如果includeSubDir参数为true</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (includeSubDir)<br />        {<br />            DirectoryInfo[] dirs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> di.GetDirectories();<br />            </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (DirectoryInfo dir </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> dirs)<br />            {<br />                totalSize </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> CalculateDirSize(dir, includeSubDir);<br />            }<br />        }<br /><br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> totalSize;<br />    }</span></div><p>    问题8：<span style="COLOR: #2000ff">如何使用通配符搜索指定目录内的所有文件；</span><br />    解决方案：<br />    使用DirectoryInfo.GetFiles方法的重载版本，它可以接受一个过滤表达式，返回FileInfo数组，另外它的参数还可以指定是否对子目录进行查找。如：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dir.GetFiles("</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">.txt"， SearchOption.AllDirectories);</span></div><p>    问题9：<span style="COLOR: #2000ff">如何复制、移动、重命名、删除文件和目录；</span><br />    解决方案：使用FileInfo和DirectoryInfo类。<br />    下面是FileInfo类的相关方法：<br />    FileInfo.CopyTo：将现有文件复制到新文件，其重载版本还允许覆盖已存在文件；<br />    FileInfo.MoveTo：将指定文件移到新位置，并提供指定新文件名的选项，所以可以用来重命名文件（而不改变位置）；    FileInfo.Delete：永久删除文件，如果文件不存在，则不执行任何操作；<br />    FileInfo.Replace：使用当前FileInfo对象对应文件的内容替换目标文件，而且指定另一个文件名作为被替换文件的备份，微软考虑实在周到。</p><p>    下面是DirectoryInfo类的相关方法：<br />    DirectoryInfo.Create：创建指定目录，如果指定路径中有多级目录不存在，该方法会一一创建；<br />    DirectoryInfo.CreateSubdirectory：创建当前对象对应的目录的子目录；<br />    DirectoryInfo.MoveTo：将目录（及其包含的内容）移动至一个新的目录，也可用来重命名目录；<br />    DirectoryInfo.Delete：删除目录（如果它存在的话）。如果要删除一个包含子目录的目录，要使用它的重载版本，以指定递归删除。<br /></p><p>    注意到了没有？DirectoryInfo类少了一个CopyTo方法，不过我们可以通过递归来实现这个功能：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 复制目录到目标目录<br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="source"&gt;</span><span style="COLOR: #008000">源目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="destination"&gt;</span><span style="COLOR: #008000">目标目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CopyDirectory(DirectoryInfo source, DirectoryInfo destination)<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 如果两个目录相同，则无须复制</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (destination.FullName.Equals(source.FullName))<br />        {<br />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 如果目标目录不存在，创建它</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">destination.Exists)<br />        {<br />            destination.Create();<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 复制所有文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        FileInfo[] files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> source.GetFiles();<br />        </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (FileInfo file </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> files)<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 将文件复制到目标目录</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            file.CopyTo(Path.Combine(destination.FullName, file.Name), </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 处理子目录</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        DirectoryInfo[] dirs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> source.GetDirectories();<br />        </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (DirectoryInfo dir </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> dirs)<br />        {<br />            </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> destinationDir </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Path.Combine(destination.FullName, dir.Name);<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 递归处理子目录</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            CopyDirectory(dir, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DirectoryInfo(destinationDir));<br />        }<br />    }</span></div><p> </p><p>    问题10：<span style="COLOR: #2000ff">如何获得计算机的所有逻辑驱动器；</span><br />    解决方案：使用DriveInfo类（需要.NET 2.0）<br />    DriveInfo.GetDrives()：获得计算机的所有逻辑驱动器，返回类型为DriveInfo[]；  <br /></p><p>    问题11：<span style="COLOR: #2000ff">如何获取指定驱动器的信息；</span><br />    解决方案：<br />    DriveInfo.Name：获取驱动器的名称（如C:\）；<br />    DriveInfo.DriveType：获取驱动器的类型（如Fixed，CDRom，Removable，Network等）；<br />    DriveInfo.DriveFormat：获取驱动器的格式（如NTFS，FAT32，CDFS，UDF等）；<br />    DriveInfo.IsReady：获取驱动器是否已准备好，比如CD是否已放入CD驱动器，如果驱动器没有准备好，访问其信息会引发IOException类型异常；<br />    DriveInfo.AvailableFreeSpace：获取驱动器的可用空间；<br />    DriveInfo.TotalFreeSpace：获取驱动器总的可用空间，它与AvailableFreeSpace的不同在于AvailableFreeSpace会磁盘配额的设置；<br />    DriveInfo.TotalSize：获取驱动器总的空间；<br />    DriveInfo.RootDirectory：获得驱动器的根目录（DirectoryInfo类型）；</p><p>    至此，我们已经了解了文件和目录相关的一些基本操作。但还不清楚如何去读写文件的内容，下一篇中会详细了解这方面的操作。  </p><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/102751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-03-09 10:47 <a href="http://www.blogjava.net/wuxufeng8080/articles/102751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#行列转换</title><link>http://www.blogjava.net/wuxufeng8080/articles/102746.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 09 Mar 2007 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/102746.html</guid><description><![CDATA[
		<div>写了一天，做出来才知道没有那么难。</div>
		<div>我还向我的朋友求助，向主任请教，获得了很多版本，下面我把代码列出，和大家一起分享。</div>
		<div>我要感谢我的朋友和他的项目经理，还有我的主任。</div>
		<div> </div>
		<div>第一版</div>
		<div>#region change hang lie in DataSet out DataSet <br />       <br />  public  DataSet changehl(DataSet mm)<br />  {<br />   try<br />      {<br />       int h=mm.Tables[0].Rows.Count;<br />       int l=mm.Tables[0].Columns.Count;    <br />       DataSet myDataSet = new DataSet();<br />       DataTable namesTable= new DataTable();        <br />       for(int i=0; i&lt;h; i++)<br />       { <br />        namesTable.Columns.Add(mm.Tables[0].Rows[i][0].ToString ());<br />        }         <br />       for(int i=0;i&lt;l;i++)<br />       {     <br />        DataRow r;<br />        r=namesTable.NewRow();         <br />        for(int j=0;j&lt;h;j++)    <br />       {       <br />        r[j] = mm.Tables[0].Rows[j][i].ToString();         <br />       }<br />        if (i==0)<br />        {}<br />        else<br />       {<br />        namesTable.Rows.Add(r); <br />       }<br />    }<br />    myDataSet.Tables.Add(namesTable);      <br />       <br />    return myDataSet;<br />   }   <br />   catch(Exception ex)<br />   {<br />    return mm ;<br />    }<br />   <br />  }<br />  #endregion</div>
		<div> </div>
		<div> </div>
		<div>第二版</div>
		<div> </div>
		<div>#region change hang lie in DataGrid out DataSet </div>
		<div> </div>
		<div>private DataSet dataGridChangeRC(DataGrid ss )<br />  {<br />   DataSet myDataSet = new DataSet();<br />   try<br />   {<br />    int h=ss.Items.Count;<br />    int l=ss.Items[0].Cells.Count;<br />    string[,] ary=new string[h,l];<br />    for(int i=0;i&lt;h;i++)<br />    {<br />     for(int j=0;j&lt;l;j++)<br />     {<br />      ary[i,j]=ss.Items[i].Cells[j].Text.Trim().ToString () ;<br />     }<br />    }<br />    DataTable namesTable= new DataTable(); <br />    for(int i=0; i&lt;h; i++)<br />    { <br />     namesTable.Columns.Add(ary[i,0]);<br />    } <br />    for(int i=0;i&lt;l;i++)<br />    {     <br />     DataRow r;<br />     r=namesTable.NewRow();         <br />     for(int j=0;j&lt;h;j++)    <br />     {       <br />      r[j] = ary[j,i];       <br />     }<br />     if (i==0)<br />     {}<br />     else<br />     {<br />      namesTable.Rows.Add(r); <br />     }<br />    }<br />    myDataSet.Tables.Add(namesTable);      <br />    return myDataSet;<br />   }<br />   catch(Exception ex)<br />   {<br />       return myDataSet;<br />   }</div>
		<div>  }<br /> #endregion</div>
		<div> </div>
		<div>第三版</div>
		<div>
				<br />  using System;<br />  using System.Collections.Generic;<br />  using System.ComponentModel;<br />  using System.Data;<br />  using System.Drawing;<br />  using System.Text;<br />  using System.Windows.Forms;</div>
		<div>  namespace Win_form<br />  {</div>
		<div>     public partial class DataSet : Form<br />         {<br />          public DataSet()<br />          {<br />           InitializeComponent();<br />          }</div>
		<div>          #region change hang lie</div>
		<div>
				<br />          public static DataSet changehl(DataSet mm)<br />          {<br />           try<br />           {<br />            int sourceRowsCount = mm.Tables[0].Rows.Count;<br />            int sourceColumnsCount = mm.Tables[0].Columns.Count;</div>
		<div>            DataSet destinationDataSet = new DataSet();<br />            DataTable destinationTable = new DataTable();</div>
		<div>            #region initialize destination table<br />            for (int i = 0; i &lt; sourceRowsCount; i++)<br />            {<br />            destinationTable.Columns.Add(Convert.ToString(i));<br />            }</div>
		<div>            destinationTable.Rows.Count = sourceColumnsCount;</div>
		<div>            #endregion</div>
		<div>            #region reverse source table to destination table Using Two Dimension Matrix Reverse Arithmetic</div>
		<div>            int dcIndex;//the column number of each destination table row<br />            int srIndex;//the row number of each source table column<br />            int drIndex;<br />            int scIndex;</div>
		<div>            for (dcIndex = 0, srIndex = 0;<br />             dcIndex &lt; destinationTable.Columns.Count<br />             &amp;&amp; srIndex &lt; sourceRowsCount; dcIndex++, srIndex++)<br />            {<br />             for (drIndex = 0,scIndex=0;<br />              drIndex &lt; destinationTable.Rows.Count<br />              &amp;&amp; scIndex &lt; sourceColumnsCount; drIndex++, scIndex++)<br />             {<br />              destinationTable.Rows[drIndex][dcIndex] = mm.Tables[0].Rows[srIndex][scIndex];<br />             }<br />            }<br />            #endregion</div>
		<div>            destinationDataSet.Tables.Add(destinationTable);<br />            return destinationDataSet;<br />           }<br />           catch (Exception ex)<br />           {<br />            MessageBox.Show(ex.ToString());<br />           }<br />          }</div>
		<div>          #endregion</div>
		<div>         }<br />  }</div>
		<div> </div>
		<div>第四版</div>
		<div> </div>
		<div>using System;<br />using System.Collections.Generic;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Text;<br />using System.Windows.Forms;</div>
		<div>namespace DataSetConvert<br />{<br />    public partial class Form1 : Form<br />    {<br />        public Form1()<br />        {<br />            InitializeComponent();<br />        }<br />        private void RowtoCollumn()<br />        {<br />            DataSet sourceDataSet = new DataSet();<br />            DataSet destinationDataSet = new DataSet();<br />            int sourceRowCount = sourceDataSet.Tables[0].Rows.Count;<br />            int destinationColCount = sourceRowCount;<br />            int sourceColCount = sourceDataSet.Tables[0].Columns.Count;<br />            int destinationRowCount = sourceColCount;<br />            for(int i=0;i&lt;destinationRowCount;i++)<br />                    for (int j=0; j &lt; destinationColCount; j++)<br />                    {<br />                        destinationDataSet.Tables[0].Rows[i][j]=sourceDataSet.Tables[0].Rows[j][i];<br />                    }  <br />        <br />         }<br />    }<br />}</div>
		<div> </div>
		<div>第一版和第二版是基于 web做的第一版可以做为class和dll 第二版只可以做class 我试过生成dll 不行 第三版和第四版 是我朋友和他的项目经理做的 是在windows form 中做的</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/102746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-03-09 10:03 <a href="http://www.blogjava.net/wuxufeng8080/articles/102746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#检索当前运行进程,并关闭.</title><link>http://www.blogjava.net/wuxufeng8080/articles/89485.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 22 Dec 2006 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/89485.html</guid><description><![CDATA[编译工具:Microsoft Visual Studio 2005<br />使用语言:C#<br />程序用途:检索当前Windows运行的进程,并可以执行关闭.<br />详细源码:<br /><br /><!--c1--><div class="codetop">代码</div><div class="codemain"><!--ec1--><br />using System;<br /><br />namespace st_Face_GoRush<br />{<br />    class Program<br />    {<br />        public static void Main(string[] args)<br />        {<br />            //开始。<br />        System.Int16 i;<br />            System.String StrNameID;<br />            System.Diagnostics.Process[] ShowID = System.Diagnostics.Process.GetProcesses();<br />            for (i = 0; i &lt; ShowID.Length; i++)<br />                System.Console.WriteLine(ShowID[i].ProcessName + " " + ShowID[i].Id);<br />            System.Threading.Thread.Sleep(200);<br />            System.Console.Write("请输入你要关闭的进程名称: ");<br />            StrNameID = System.Convert.ToString(System.Console.ReadLine());<br />            System.Diagnostics.Process[] CloseID = System.Diagnostics.Process.GetProcessesByName(StrNameID);<br />            //<br />            if (CloseID.Length != 0)<br />            {<br />                for (i = 0; i &lt; CloseID.Length; i++)<br />                {<br />                    if (CloseID[i].Responding &amp;&amp; !CloseID[i].HasExited)<br />                    {<br />                        System.Console.WriteLine("指定进程存在而且正在响应中...正在关闭.");<br />                        CloseID[i].CloseMainWindow();<br />                        if (!CloseID[i].HasExited)<br />                        {<br />                            System.Console.WriteLine("由于特别原因无法关闭进程,现在强制关闭!!!");<br />                            CloseID[i].Kill();<br />                        }<br />                    }<br />                    else<br />                    {<br />                        System.Console.WriteLine("指定进程存在但无法响应...正在强制关闭!");<br />                        CloseID[i].Kill();<br />                    }<br />                }<br />            }<br />            else<br />                System.Console.WriteLine("指定进程不存在无法关闭!请确认输入正确.");<br />        }<br /><br />    }<br />}<br /><!--c2--></div><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/89485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-22 12:02 <a href="http://www.blogjava.net/wuxufeng8080/articles/89485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在ASP.NET中用OWC绘制图表 </title><link>http://www.blogjava.net/wuxufeng8080/articles/87617.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 14 Dec 2006 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/87617.html</guid><description><![CDATA[一、概述  
<p></p><p>在开发应用程序时，经常会遇到必须提供交互式图表的情况。例如，你可能在开发一个管理销售和产品数据的应用程序，数据保存在SQL Server数据库上，应用程序允许用户添加数据、更新现有数据，但除了这些功能之外，客户还要求应用程序能够用饼图、柱形图或XY散点图的形式直观地描述数据。 </p><p>在Windows桌面应用程序中，这类要求从来不成为问题，可供选用的图形库和绘图组件实在太多了。但对于Web应用程序，问题就变得复杂多了。要在Web应用中绘制图表，可供选择的办法包括： </p><p>■ 客户端： </p><p>利用各种ActiveX组件，Web浏览器内完全有可能达到“丰富”Windows客户程序那样的功能。缺点是客户端的设置复杂化，要求发布客户端软件，通常按照每客户端的方式计算许可证费用。另外，非MS Windows/IE的客户端一般难以运行。 </p><p>■ 服务器端： </p><p>利用Web服务器上运行的服务器端代码，动态地生成图表，然后以GIF或JPG图形的形式发送给客户端。这种办法的优点是，客户端只需要一个标准的浏览器。与客户端技术相比的缺点是，图形的交互能力差（除非向服务器提交新的请求，否则就不能缩放、滚动）。许多地图网站（例如Mapquest.com）大量地运用了这一技术。注意，地图图形不是保存在Web服务器上，而是用户发出一个请求时动态从地图数据库生成。 </p><p>本文主要讨论如何利用服务器端的图表绘制技术在ASP.NET Web页面中提供图形功能</p><p>二、设置图表引擎 </p><p>如果要在ASP.NET应用程序中绘制图表，必须要有一个合适的图表引擎。ASP.NET有一个内建的图形工具库，即System.Drawing名称空间的GDI+，可以用来创建简单的饼图、柱形图、折线图等，不过它属于低级的API，算不上绘制图表的引擎，特别是不适合绘制复杂的图表。 <br />   本文要讨论的主角是OWC，即Office Web Components，或者“Office Web组件”。按照微软的定义，OWC是一种“将类似Office的功能扩展到Web的微软技术”。它可以在客户端使用，例如我们将Excel工作表保存为Web页面时就要用到，利用它可以方便地将交互式电子表格和图表发布到Web页面。同时，OWC也是一个优秀的服务器端图表引擎，具有与MS Excel同样强大的图表绘制能力。 </p><p>三、OWC的许可证问题 </p><p>如果你曾经用过版本较早的OWC，可能已经遇到过微软的许可证问题。以前这个问题相当令人烦恼，微软不仅要求服务器上必须有Office许可证，而且每一台客户PC上也同样要有。 </p><p>实际上，这相当于将OWC的用途局限到了Intranet之内，只有Intranet之内才可以保证客户PC上都安装了Office许可证。不过现在微软的态度有所放缓——服务器上仍旧要安装Office许可证，但只要图表是“非交互式”用途，例如本文的服务器端图表绘制，客户端就不必再装Office许可证。实际上，就连服务器端也不必安装完整的Office许可证，Excel 2002或FrontPage 2002的许可证就已足够，从而使OWC变成了价廉物美的服务器端图表引擎。 </p><p>那么，在服务器上安装MS Office？不，没有必要。虽然从许可证条件看，OWC应该是Office的一部分，但从技术上说，OWC是一个独立的产品。Web服务器上只需安装OWC软件包，不必安装整个Office。 </p><p>OWC首次出现于Office 2000，即OWC 9.0。在Office XP中，OWC的编程模式已作了修改，这使得OWC XP（也就是OWC 10）不能与OWC 9.0完全兼容。OWC 10要求在ASP.NET环境中运行，所以OWC 10软件包必须安装到ASP.NET服务器上。 </p><p>接下来，很自然的一个问题是：哪里可以下载OWC 10软件包？令人惊奇的是，它可以从微软的网站免费下载，地址是<a href="http://office.microsoft.com/downloads/2002/owc10.aspx" target="_blank"><font color="#000000">http://office.microsoft.com/downloads/2002/owc10.aspx</font></a>，<br />(中文地址：<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=982B0359-0A86-4FB2-A7EE-5F3A499515DD" target="_blank"><font color="#000000">http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=982B0359-0A86-4FB2-A7EE-5F3A499515DD</font></a>　网际浪子注)但要注意的是，Web服务器上必须安装了某种Office 2002的许可证才能合法地使用OWC 10。 </p><p>四、OWC的运行机制 </p><p>OWC是一组COM（ActiveX）控件的集合，涵盖电子表格、图表、数据透视表等功能。它经常被当作客户端技术使用，这时COM控件就安装在客户端PC上。如果在服务器端使用，人们主要感兴趣的是它的图表绘制功能。 </p><p>有了OWC，我们可以在ASP.NET Web服务器上动态创建一个图表，然后将图表以GIF图形的形式发送到客户端。客户端看到的仅仅是一个普通的图形文件，但在“背后”，图形文件实际上是由服务器上ASP.NET回应客户请求时动态生成的。因此，这种技术对客户端没有特殊的要求，只要能够显示GIF图形就可以了，即使Netscape和Opera也不存在任何问题。 </p><p>既然如此，为什么在ASP.NET开发领域中，OWC这一优秀的微软技术尚未被广泛采用呢？微软根本不为OWC作市场宣传，再加上令人迷惑的许可证问题，当然令许多开发者望而却步。也许微软认为该产品还没有完全成熟，即将到来的Office 2003将会带来OWC 11，它的编程模式还会有所改变。另外，还有一种可能是微软担心OWC技术的广泛采用会影响Office的销售。 </p><p>再者，关于OWC的编程实例很少。微软知识库有几个客户端的例子和“传统”ASP的服务器端例子，但找不到在ASP.NET环境中使用OWC 10的例子。OWC的新闻组，microsoft.public.office.developer.web.components，主要讨论的也是客户端的应用。如果你要在ASP.NET环境中使用OWC 10，主要还是靠自己摸索。正是因为这些原因，所以本文从相当广泛的角度探讨了该技术的实际应用。 </p><p>五、在Web服务器上安装OWC 10 </p><p>要想在ASP.NET Web服务器上用OWC绘制图表，首先应当安装必要的软件和修改一些配置。 </p><p>第一，Web服务器上当然应该有ASP.NET运行环境。除了.NET Framework Redistributable，还要有GACUTIL程序（属于.NET框架SDK）来配置OWC控件，也就是说，还要安装.NET Framework SDK工具。如果把.NET Framework 1.1 Redistributable和SDK安装到了默认目录，PATH环境变量的内容应当包含：C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322;C:\Program Files\Microsoft.NET\SDK\v1.1\Bin。 </p><p>接下来再在Web服务器上安装OWC 10。OWC可以从微软免费下载，安装时只要采用所有默认选项即可。 </p><p>由于OWC 10是一种COM技术，为了让.NET代码使用OWC 10组件，还必须安装Office XP的Primary Interop Assembly（PIA），PIA可以从微软网站下载（<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/odc_oxppias.asp" target="_blank"><font color="#000000">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/odc_oxppias.asp</font></a>）。<br />(网际浪子发现的地址是：<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C41BD61E-3060-4F71-A6B4-01FEBA508E52&amp;displaylang=en" target="_blank"><font color="#000000">http://www.microsoft.com/downloads/details.aspx?FamilyId=C41BD61E-3060-4F71-A6B4-01FEBA508E52&amp;displaylang=en</font></a>)<br />下载得到的OXPPIA.exe是一个压缩文件，现在把它解压缩到服务器上的一个目录，假设是C:\oxppia，然后启动一个命令窗口（注意，确保PATH环境变量已正确设置[网际浪子注：可以用我作的SETPATH.BAT运行一下]），转到c:\oxppia目录，运行REGISTER.bat。 </p><p>这个命令把Office XP PIA导入到全局程序集缓冲区，修改注册表设置。注意观察REGISTER.bat命令的输出，确信GACUTIL命令确实在运行。如果PATH环境变量设置有误，PIA不可能正确导入。README文档说应当用VS.NET命令行环境，但Web服务器上可能没有安装VS.NET，这时就要手工修改PATH环境变量了（效果一样）。 </p><p>最后，还要把下面这行代码加入Web服务器的machine.config文件的&lt;assemblies&gt;节，对于.NET Framework 1.1，machine.config文件可以在C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG目录下找到： </p><p><br />&lt;add assembly="Microsoft.Office.Interop.OWC, Version=10.0.4504.0, <br />     Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&gt;<br /> </p><p>浪子注明：如果发生不能编译的错误，可能要再次运行注册步骤！我这里这样，大家如果不一样，可以自己试试。</p><p>六、OWC编程模式 <br />   要生成图表的数据称为数据原，Chart Component组件支持的数据源有：实现IDataSource接口的任何数据源；ADO Recordset对象；XML文件；数组或者一定格式的文本字符串。在ASP中，我们可以用ADO Recordset对象；在.NET的ADO.NET中，由于ADO.NET没有实现IDataSource，.NET也没有提供ADO.NET DataSet对象向ADO Recordset对象的直接转换，如果你有一个 DataSet对象，你要么转换成XML文件，要么生成特殊格式的字符串才可以使用。下面就是本例子的结果：<br /><br /></p><p>[浪子注明：如果出错，可能是文件夹权限的问题，我的就是，要将虚拟目录的everyone的全部权限加上！]</p><p></p><p>下面是实现这种功能的VB.NET版本的ASP.NET例子与代码：</p><p>OWC.aspx:</p><p>&lt;%@ Page Language="vb" AutoEventWireup="false" Codebehind="OWC.aspx.vb" Inherits="aspxWeb.OWC"%&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" &gt;<br />&lt;HTML&gt;<br />  &lt;HEAD&gt;<br />    &lt;title&gt;WebForm1&lt;/title&gt;<br />    &lt;meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"&gt;<br />    &lt;meta name="CODE_LANGUAGE" Content="C#"&gt;<br />    &lt;meta name="vs_defaultClientScript" content="javascript"&gt;<br />    &lt;meta name="vs_targetSchema" content="<a href="http://schemas.microsoft.com/intellisense/ie5&quot;" target="_blank"><font color="#000000">http://schemas.microsoft.com/intellisense/ie5"</font></a>;&gt;<br />  &lt;/HEAD&gt;<br />  &lt;body MS_POSITIONING="GridLayout"&gt;<br />    &lt;form id="Form1" method="post" runat="server"&gt;<br />      &lt;asp:placeholder id="ChartHolder" runat="server"&gt;&lt;/asp:placeholder&gt;<br />    &lt;/form&gt;<br />  &lt;/body&gt;<br />&lt;/HTML&gt;</p><p><br />OWC.aspx.vb：</p><p>Imports System<br />Imports OWC<br />Imports System.Web.UI</p><p>Public Class OWC<br />  Inherits System.Web.UI.Page<br />  Protected WithEvents ChartHolder As System.Web.UI.WebControls.PlaceHolder</p><p>#Region " Web 窗体设计器生成的代码 "</p><p>  '该调用是 Web 窗体设计器所必需的。<br />  &lt;System.Diagnostics.DebuggerStepThrough()&gt; Private Sub InitializeComponent()</p><p>  End Sub</p><p>  Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init<br />    'CODEGEN: 此方法调用是 Web 窗体设计器所必需的<br />    '不要使用代码编辑器修改它。<br />    InitializeComponent()<br />  End Sub</p><p>#End Region</p><p>  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<br />    '在此处放置初始化页的用户代码<br />    '创建ChartSpace对象来放置图表<br />    Dim objCSpace As ChartSpace = New ChartSpaceClass()<br />    '在ChartSpace对象中添加图表，Add方法返回chart对象<br />    Dim objChart As WCChart = objCSpace.Charts.Add(0)<br />    '指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到<br />    objChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered</p><p>    '指定图表是否需要图例<br />    objChart.HasLegend = True</p><p>    '给定标题<br />    objChart.HasTitle = True<br />    objChart.Title.Caption = "1-6说数据分布图"</p><p>    '给定x,y轴的图示说明<br />    objChart.Axes(0).HasTitle = True<br />    objChart.Axes(0).Title.Caption = "Y 轴 : 数量"<br />    objChart.Axes(1).HasTitle = True<br />    objChart.Axes(1).Title.Caption = "X 轴： 月份"</p><p>    '计算数据<br />    '*categories 和 values 可以用tab分割的字符串来表示*<br />    Dim strSeriesName As String = "图例 1"<br />    Dim strCategory As String = "1" + ControlChars.Tab + "2" + ControlChars.Tab _<br /> + "3" + ControlChars.Tab + "4" + ControlChars.Tab + "5" + ControlChars.Tab _<br /> + "6" + ControlChars.Tab<br />    Dim strvalue As String = "9" + ControlChars.Tab + "8" + ControlChars.Tab _<br /> + "4" + ControlChars.Tab + "10" + ControlChars.Tab + "12" + ControlChars.Tab _<br /> + "6" + ControlChars.Tab</p><p>    '添加一个series<br />    objChart.SeriesCollection.Add(0)</p><p>    '给定series的名字<br />    objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimSeriesNames,_<br />  ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName)</p><p>    '给定分类<br />    objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimCategories,_<br />  ChartSpecialDataSourcesEnum.chDataLiteral, strCategory)</p><p>    '给定值<br />    objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimvalues,_<br />  ChartSpecialDataSourcesEnum.chDataLiteral, strvalue)<br />    '输出成GIF文件.<br />    Dim strAbsolutePath As String = (Server.MapPath(".")) + "\Images\test.gif"<br />    objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350)</p><p>    '创建GIF文件的相对路径.<br />    Dim strRelativePath As String = "Images/test.gif"<br />    '把图片添加到placeholder.<br />    Dim strImageTag As String = "&lt;IMG SRC='890_files/&amp;quot; + strrelativepath + &amp;quot;'/&gt;"</p><p>    ChartHolder.Controls.Add(New LiteralControl(strImageTag))<br />  End Sub<br />  <br />End Class</p><p>下面是C#版本的OWC.asp.cs</p><p>using System;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Web;<br />using System.Web.SessionState;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.HtmlControls;<br />using Microsoft.Office.Interop; <br />namespace Microsoft.Office.Interop.OWC使用指南<br />{<br /> /// &lt;summary&gt;<br /> /// WebForm1 的摘要说明。<br /> /// &lt;/summary&gt;<br /> public class WebForm1 : System.Web.UI.Page<br /> {<br />  protected System.Web.UI.WebControls.PlaceHolder ChartHolder;<br />  private Microsoft.Office.Interop.OWC.ChartChartTypeEnum GetChartType(int typeIndex)<br />  {<br />   int i;<br />   Microsoft.Office.Interop.OWC.ChartChartTypeEnum myTE;<br />   i=typeIndex;<br />   <br />   switch(i)<br />   {<br />    case 0:<br />     myTE=Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeColumnClustered;<br />     return myTE;<br />    case 1:<br />     myTE=Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypePie;<br />     return myTE;<br />    case 2:<br />     myTE=Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeSmoothLine;<br />     return myTE;<br />    case 3:<br />     myTE=Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeArea;<br />     return myTE;<br />    case 4:<br />     myTE=Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeRadarLine;<br />     return myTE;<br />    default:<br />     myTE=Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeColumnClustered;<br />     return myTE;<br />   }<br />  }</p><p>  private void Page_Load(object sender, System.EventArgs e)<br />  {<br />   // 在此处放置用户代码以初始化页面<br />   //创建ChartSpace对象来放置图表<br />   Microsoft.Office.Interop.OWC.ChartSpace objCSpace = new Microsoft.Office.Interop.OWC.ChartSpaceClass(); </p><p>   //在ChartSpace对象中添加图表，Add方法返回chart对象<br />   <br />   Microsoft.Office.Interop.OWC.ChChart   objChart = objCSpace.Charts.Add (0); </p><p>   //指定图表的类型。类型由Microsoft.Office.Interop.OWC.ChartChartTypeEnum枚举值得到<br />   //objChart.Type = Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeColumnClustered;<br />   //上面的是画棒图的方法<br />   //objChart.Type = Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeSmoothLine;<br />   //上面的是画平滑曲线的方法<br /><br /><br />   objChart.Type =Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeRadarLine;<br />   //上面的是画雷达线的方法<br />   //objChart.Type =Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypeArea;<br />   //上面的是画区域线的方法</p><p>   //objChart.Type =Microsoft.Office.Interop.OWC.ChartChartTypeEnum.chChartTypePie;<br />   //上面的是画饼图的方法，但是要关掉一些参数，比如<br />   /*//objChart.Axes[0].HasTitle = true;<br />   //objChart.Axes[0].Title.Caption = "Y ： 数量";<br />   //objChart.Axes[1].HasTitle = true;<br />   //objChart.Axes[1].Title.Caption = "X ： 月份";</p><p>    * */<br /><br />   //指定图表是否需要图例<br />   objChart.HasLegend = true;</p><p>   //给定标题<br />   objChart.HasTitle = true;<br />   objChart.Title.Caption= "上半年分布图";</p><p>   //给定x,y轴的图示说明<br />   objChart.Axes[0].HasTitle = true;<br />   objChart.Axes[0].Title.Caption = "Y ： 数量";<br />   objChart.Axes[1].HasTitle = true;<br />   objChart.Axes[1].Title.Caption = "X ： 月份";</p><p>   //计算数据<br />   /*categories 和 values 可以用tab分割的字符串来表示*/<br />   string strSeriesName = "图例 1";<br />   string strCategory = "1" + '\t' + "2" + '\t' + "3" + '\t'+"4" + '\t' + "5" + '\t' + "6" + '\t';<br />   string strvalue = "9" + '\t' + "8" + '\t' + "4" + '\t'+"10" + '\t' + "12" + '\t' + "6" + '\t';</p><p>   //添加一个series<br />   objChart.SeriesCollection.Add(0);</p><p>   //给定series的名字<br />   objChart.SeriesCollection[0].SetData (Microsoft.Office.Interop.OWC.ChartDimensionsEnum.chDimSeriesNames,<br />    + (int)Microsoft.Office.Interop.OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName);</p><p>   //给定分类<br />   objChart.SeriesCollection[0].SetData (Microsoft.Office.Interop.OWC.ChartDimensionsEnum.chDimCategories,<br />    + (int)Microsoft.Office.Interop.OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strCategory);</p><p>      </p><p>   //给定值<br />   objChart.SeriesCollection[0].SetData<br />    (Microsoft.Office.Interop.OWC.ChartDimensionsEnum.chDimvalues,<br />    (int)Microsoft.Office.Interop.OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strvalue); <br />   //输出成GIF文件.<br />   string strAbsolutePath = (Server.MapPath(".")) + "\\test.gif";<br />   objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350);</p><p>   //创建GIF文件的相对路径.<br />   string strRelativePath = "./test.gif";</p><p>   //把图片添加到placeholder.<br />   string strImageTag = "&lt;IMG SRC='" + strRelativePath + "'/&gt;";<br />   ChartHolder.Controls.Add(new LiteralControl(strImageTag));<br />  }</p><p>  #region Web Form Designer generated code<br />  override protected void OnInit(EventArgs e)<br />  {<br />   //<br />   // CODEGEN：该调用是 ASP.NET Web 窗体设计器所必需的。<br />   //<br />   InitializeComponent();<br />   base.OnInit(e);<br />  }<br /> <br />  /// &lt;summary&gt;<br />  /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br />  /// 此方法的内容。<br />  /// &lt;/summary&gt;<br />  private void InitializeComponent()<br />  {    <br />   this.Load += new System.EventHandler(this.Page_Load);</p><p>  }<br />  #endregion</p><p> }<br />}</p><p><br />如果用ADO.NET的DataSet对象，可以生成以TAB分割的字符串：</p><p>strvalue += (nodes.Item(j).ChildNodes.Item(0).InnerText + '\t');<br />strCategory += (nodes.Item(j).ChildNodes.Item(1).InnerText + '\t');</p><p></p><p><br />Microsoft.Office.Interop名称空间指向Office XP PIA，PIA应该事先安装到Web服务器上。编译源代码时要用到Office XP PIA OWC的DLL文件。如果用VS.NET编译，只要加入一个Microsoft.Office.Interop.Owc.dll文件的引用即可（位于解开Office XP PIA文件的目录），如果从命令行编译，必须按照下列方式使用/r:参数： </p><p>vbc /t:library /out:bin\getchart.dll /r:System.dll /r:System.Web.dll <br />   /r:System.Data.dll <br />   /r:C:\oxppia\Microsoft.Office.Interop.Owc.dll getchart.aspx.vb<br /> </p><p><br />上面的代码有许多值得一提的地方。首先，我们假定数据源位于MSSQL数据库OWCDEMO，该数据库有一个OWCDATA表，OWCDATA表有两个数值列，分别是X和Y。getchart.aspx的目标就是从数据库获取记录，然后用散点图（XY）描述这些数据。 </p><p>OWC图表的数据点无法直接从ASP.NET的DataSet获取，因此，我们首先要把数据库的数据装入数组，然后用数组的数据填写OWC图表的数据点。如果要对本例作改进的话，最好开发一个ASP.NET服务器控件，它能够从抽象的数据源（包括DataSet对象、XML文件或数组）获取数据并生成XY散点图。 </p><p>DataReader要比DataSet快速、高效，不过，我们首先要确定数据库中的记录数量，根据记录数量来调整数组的大小。为此，我们先用一个SQL Select count(*)查询获取记录数量，然后定义数组大小，最后用第二个SQL SELECT查询获取数据库记录。 </p><p>如果我们要让散点图的各个点用折线连接起来，记录必须依照X轴排序，这通过一个SQL ORDER BY子句实现。 </p><p>OWC的图表建立在“绘图空间”上。一个绘图空间可以包含一个或多个图表，每一个图表可以有一个或多个数据系列。在生成OWC图表时，我们首先创建一个绘图空间，将一个图表加入到绘图空间，设置图表的类型，添加数据系列，最后用数组的数据填写数据系列。 </p><p>另外，我们还可以设置（可选）各种布局参数，例如颜色、坐标标题、图表标题、图例，等等。OWC提供了数百个布局参数，我们可以随心所欲地调整图表。当然，对于不同的图表类型，绘图模式也略有不同，例如，饼图和散点图的参数设置方法是不同的。在OWC 10安装包中有OWC帮助文件，里面详细说明了OWC图表模型。 </p><p>最后，Response.BinaryWrite参数指定了要输出的图形类型（GIF），以及图形的宽度、高度（以像素为单位）。在这里，我们可以根据需要缩放从OWC图表生成的图形。 </p><p></p><p>对了，忘了说代码的位置了，在FTP里的论坛问题解答里，有一个OWC使用指南的目录，下面有使用OWC的全部文件和源码。</p><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/87617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-14 09:25 <a href="http://www.blogjava.net/wuxufeng8080/articles/87617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#.net常用函数列表</title><link>http://www.blogjava.net/wuxufeng8080/articles/84707.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 01 Dec 2006 00:05:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/84707.html</guid><description><![CDATA[1、DateTime 数字型 <br />System.DateTime currentTime=new System.DateTime(); <br />1.1 取当前年月日时分秒 <br />currentTime=System.DateTime.Now; <br />1.2 取当前年 <br />int 年=currentTime.Year; <br />1.3 取当前月 <br />int 月=currentTime.Month; <br />1.4 取当前日 <br />int 日=currentTime.Day; <br />1.5 取当前时 <br />int 时=currentTime.Hour; <br />1.6 取当前分 <br />int 分=currentTime.Minute; <br />1.7 取当前秒 <br />int 秒=currentTime.Second; <br />1.8 取当前毫秒 <br />int 毫秒=currentTime.Millisecond; <br />（变量可用中文） <br /><br />1.9 取中文日期显示——年月日时分 <br />string strY=currentTime.ToString("f"); //不显示秒 <br /><br />1.10 取中文日期显示_年月 <br />string strYM=currentTime.ToString("y"); <br /><br />1.11 取中文日期显示_月日 <br />string strMD=currentTime.ToString("m"); <br /><br />1.12 取当前年月日，格式为：2003-9-23 <br />string strYMD=currentTime.ToString("d"); <br /><br />1.13 取当前时分，格式为：14：24 <br />string strT=currentTime.ToString("t"); <br /><br />2、Int32.Parse(变量) Int32.Parse("常量") <br />字符型转换 转为32位数字型 <br /><br />3、 变量.ToString() <br />字符型转换 转为字符串 <br />12345.ToString("n"); //生成 12,345.00 <br />12345.ToString("C"); //生成 ￥12,345.00 <br />12345.ToString("e"); //生成 1.234500e+004 <br />12345.ToString("f4"); //生成 12345.0000 <br />12345.ToString("x"); //生成 3039 (16进制) <br />12345.ToString("p"); //生成 1,234,500.00% <br /><br /><br />4、变量.Length 数字型 <br />取字串长度： <br />如： string str="中国"; <br />int Len = str.Length ; //Len是自定义变量， str是求测的字串的变量名 <br /><br />5、System.Text.Encoding.Default.GetBytes(变量) <br />字码转换 转为比特码 <br />如：byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); <br />然后可得到比特长度： <br />len = bytStr.Length; <br /><br />6、System.Text.StringBuilder("") <br />字符串相加，（+号是不是也一样？） <br />如：System.Text.StringBuilder sb = new System.Text.StringBuilder(""); <br />sb.Append("中华"); <br />sb.Append("人民"); <br />sb.Append("共和国"); <br /><br />7、变量.Substring(参数1,参数2); <br />截取字串的一部分，参数1为左起始位数，参数2为截取几位。 <br />如：string s1 = str.Substring(0,2); <br /><br />8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />取远程用户IP地址 <br /><br />9、穿过代理服务器取远程用户真实IP地址： <br />if(Request.ServerVariables["HTTP_VIA"]!=null){ <br />string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); <br />}else{ <br />string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />} <br /><br />10、 Session["变量"]; <br />存取Session值； <br />如，赋值： Session["username"]="小布什"; <br /><br />取值： Object objName=Session["username"]; <br />String strName=objName.ToString(); <br />清空： Session.RemoveAll(); <br /><br />11、String str=Request.QueryString["变量"]; <br />用超链接传送变量。 <br />如在任一页中建超链接:&lt;a href=Edit.aspx?fbid=23&gt;点击&lt;/a&gt; <br />在Edit.aspx页中取值：String str=Request.QueryString["fdid"]; <br /><br />12、DOC对象.CreateElement("新建节点名"); <br />创建XML文档新节点 <br /><br />13、父节点.AppendChild(子节点)； <br />将新建的子节点加到XML文档父节点下 <br /><br />14、 父节点.RemoveChild(节点); <br />删除节点 <br /><br />15、Response <br />Response.Write("字串")； <br />Response.Write(变量)； <br />向页面输出。 <br /><br />Response.Redirect("URL地址"）； <br />跳转到URL指定的页面 <br /><br />16、char.IsWhiteSpce(字串变量，位数)——逻辑型 <br />查指定位置是否空字符； <br />如： <br />string str="中国 人民"; <br />Response.Write(char.IsWhiteSpace(str,2)); //结果为：True, 第一个字符是0位，2是第三个字符。 <br /><br />17、char.IsPunctuation(''''字符'''') --逻辑型 <br />查字符是否是标点符号 <br />如：Response.Write(char.IsPunctuation(''''A'''')); //返回：False <br /><br />18、(int)''''字符'''' <br />把字符转为数字，查代码点，注意是单引号。 <br />如： <br />Response.Write((int)''''中''''); //结果为中字的代码：20013 <br /><br />19、(char)代码 <br />把数字转为字符，查代码代表的字符。 <br />如： <br />Response.Write((char)22269); //返回“国”字。 <br /><br />20、 Trim() <br />清除字串前后空格 <br /><br />21 、字串变量.Replace("子字串","替换为") <br />字串替换 <br />如： <br />string str="中国"; <br />str=str.Replace("国","央"); //将国字换为央字 <br />Response.Write(str); //输出结果为“中央” <br /><br />再如：（这个非常实用） <br /><br />string str="这是&lt;script&gt;脚本"; <br />str=str.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); //将左尖括号替换为&lt;font&gt; 与 &lt; 与 &lt;/font&gt; （或换为&lt;，但估计经XML存诸后，再提出仍会还原） <br />Response.Write(str); //显示为：“这是&lt;script&gt;脚本” <br /><br />如果不替换，&lt;script&gt;将不显示，如果是一段脚本，将运行；而替换后，脚本将不运行。 <br />这段代码的价值在于：你可以让一个文本中的所有HTML标签失效，全部显示出来，保护你的具有交互性的站点。 <br />具体实现：将你的表单提交按钮脚本加上下面代码： <br />string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。 <br />strSubmit=strSubmit.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); <br />然后保存或输出strSubmit。 <br />用此方法还可以简单实现UBB代码。 <br /><br />22、Math.Max(i,j) <br />取i与j中的最大值 <br />如 int x=Math.Max(5,10); // x将取值 10 <br /><br />23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: <br /><br />(1)、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } <br /><br />(2)、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. <br /><br />(3)、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. <br /><br />24、IndexOf() 、LastIndexOf() <br />查找字串中指定字符或字串首次（最后一次）出现的位置,返回索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） <br /><br />25、Insert() <br />在字串中指定索引位插入指定字符。如： <br />str1.Insert(1,"字");在str1的第二个字符处插入“字”，如果str1="中国"，插入后为“中字国”； <br /><br />26、PadLeft()、PadRight() <br />在字串左（或右）加空格或指定char字符，使字串达到指定长度，如： <br />&lt;% <br />string str1="中国人"; <br />str1=str1.PadLeft(10,''''1''''); //无第二参数为加空格 <br />Response.Write(str1); //结果为“1111111中国人” ， 字串长为10 <br />%&gt; <br /><br />27、Remove() <br />从指定位置开始删除指定数的字符 <br />字串对比一般都用: if(str1==str2){ } , 但还有别的方法: <br /><br />1、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } <br /><br />2、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. <br /><br />3、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. <br /><br />IndexOf() <br />查找字串中指定字符或字串首次出现的位置,返首索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置）  <br /><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/84707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-01 08:05 <a href="http://www.blogjava.net/wuxufeng8080/articles/84707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NHibernate快速指南(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/58184.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 14 Jul 2006 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/58184.html</guid><description><![CDATA[NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。<br /><br />NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate 为你处理这些，远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联，NHibernat 自动产生SQL语句，并确保对象提交到正确的表和字段中去。<br /><br /><br /><br />为什么写这个指南<br /><br /><br /><br />任何熟悉Hibernate的人会发现这篇指南和Glen Smith 的 A Hitchhiker's Guide to Hibernate 非常相近。这里的内容正是基于他的指南，因此所有的感谢都应该给与他。<br /><br />NHibernate的文档并非每处都和Hibernate的文档一致。然而，项目的相似应该能使读者通过读Hibernate的文档来很好的理解NHibernate如何工作。<br /><br />这篇文档意在让你尽可能快的开始使用NHibernate。它将介绍如何持久化一个简单的对象到一张表里。想得到更多的复杂的例子，可以参考NUnit测试及附带代码。<br /><br /><br /><br />开发的过程<br /><br /><br /><br />Nhibernate未来将会提供一些工具帮助你自动产生schema文件（现在还是基于代码）或是通过映射文件产生类（在筹措阶段）或是更新schema(来自于一个新开发者的建议)。然而，这里我们的例子是假定一切来自于完全手写，包括设置表和.Net类的编写。我们将进行以下步骤。<br /><br />1．新建一个将要持久化.Net对象的表<br /><br />2．构建一个需要被持久化的.Net类<br /><br />3．构建一个可以让NHibernate知道如何持久化对象属性的映射文件<br /><br />4．构建一个让NHibernate知道如何连接数据库的配置文件]<br /><br />5．使用NHibernate的API<br /><br /><br /><br />第一步：写构建表的SQL<br /><br /><br /><br />这里我们将使用的是一个非常简单的例子。假设你正在为你的网站开发一个基本的用户管理子系统。我们将使用如下的一张User表（假定你已经设置好一个数据库—在的例子里我称它为NHibernate）。<br /><br /><br /><br /><br /><br /><br />use NHibernate<br />go<br /><br />CREATE TABLE users (<br />LogonID nvarchar(20) NOT NULL default '0',<br />Name nvarchar(40) default NULL,<br />Password nvarchar(20) default NULL,<br />EmailAddress nvarchar(40) default NULL,<br />LastLogon datetime default NULL,<br />PRIMARY KEY (LogonID)<br />)<br />go<br />我使用的是MS Sql Server 2000, 但也可以使用任何数据库，只要你有关于它们的基于.Net数据提供驱动程序。我们将得到一个含有LogonID,Name, Password, Email 和LastLogon的表. 经过以上标准步骤，我们下一步是写一个.Net类处理一个给定的User对象。<br /><br />第二步:产生一个.Net 类文件<br /><br /><br /><br />当内存中有一堆User对象的时候，我们需要某种对象去保存它们。NHibernate通过对象属性的反射来工作，因此我们需要添加我们希望持久化的对象属性。一个可以被NHibernate持久化的类应该看起来象下面的样子：<br /><br /><br />using System;<br /><br />namespace NHibernate.Demo.QuickStart<br />{<br />public class User<br />{<br />private string id;<br />private string userName;<br />private string password;<br />private string emailAddress;<br />private DateTime lastLogon;<br /><br /><br />public User()<br />{<br />}<br /><br />public string Id <br />{<br />get { return id; }<br />set { id = value; }<br />}<br /><br />public string UserName <br />{<br />get { return userName; }<br />set { userName = value; }<br />}<br /><br />public string Password <br />{<br />get { return password; }<br />set { password = value; }<br />}<br /><br />public string EmailAddress <br />{<br />get { return emailAddress; }<br />set { emailAddress = value; }<br />}<br /><br />public DateTime LastLogon <br />{<br />get { return lastLogon; }<br />set { lastLogon = value; }<br />}<br /><br />}<br />}<br />在上面的例子里，我们的属性和构建函数 是public，但这个对NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private来持久化数据。<br /><br /><br /><br />第三步：写映射文件<br /><br />现在我们有数据表和需要去映射它的.Net类。我们需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。最易于管理的办法是为每一个类写一个映射文件，如果你命名它是YourObject.hbm.xml 并且把它放在和类的同一个目录里，NHiberante将会使得事情简单起来。下面是一个User.hbm.xml的例子：<br /><br /><br />&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"&gt;<br />&lt;class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users"&gt;<br />&lt;id name="Id" column="LogonId" type="String" length="20"&gt; <br />&lt;generator class="assigned" /&gt; <br />&lt;/id&gt; <br />&lt;property name="UserName" column= "Name" type="String" length="40"/&gt; <br />&lt;property name="Password" type="String" length="20"/&gt; <br />&lt;property name="EmailAddress" type="String" length="40"/&gt;<br />&lt;property name="LastLogon" type="DateTime"/&gt;<br />&lt;/class&gt;<br /><br />&lt;/hibernate-mapping&gt;<br /><br />让我们来看看这个文件中让我们感兴趣的某些行。第一个有趣的标签是class。这里我们将映射类型名称(类名和装配件)到我们数据库中的User表，这里和Hibernate有一点点的不同。你将不得不告诉NHibernate从何处提取对象。在这个例子里我们从装配件NHibernate.Examples装载类NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同样的规则来加载类型。因此如果你在如何指定类型的方面有些混淆，请参看.Net Framework SDK。<br /><br />让我们先跳过id标签，来讨论property标签。简要看一下，你将发现NHibernate所要做的工作。name属性的值正是我们.Net 类的属性，column属性值将是我们数据库里的字段。type属性是可选的（如果你不标明，NHibernate将利用反射进行最佳的推测）。<br /><br />好了，让我们回到标签id, 你可以猜测到这个标签将是映射数据库表的主键，的确如此，id标签的组成和我们刚才看的property标签是相似的。我们映射属性到目标数据库的字段。<br /><br />内嵌的generator 标签告诉NHibernate 如何生成主键（它将恰当的为你生成主键，不管你指定何种类型，但你必须告诉它）。在我们的例子里，我们设定为assigned,意味着我们对象将自己生成主键（毕竟User对象常常需要一个UserID）。如果你执意要NHiberante为你生成主键，你感兴趣于设定uuid.hex和uuid.string（从文档中获取更多信息）<br /><br /><br /><br />提示：如果你使用Visual Studio.Net 去编译的话，请将user.hbm.xml的Build Action属性设置为Embedded Resource。映射文件将成为装配件的一部分。更详细的细节重点将在后面展示。<br /><br />提示：如果你仅仅是改变映射文件，你不能使用build 而应该Rebuild项目。Visual Studio.Net 不会重新编译有改变的映射文件。<br /><br /><br /><br />第四步：为你的数据库产生一个配置文件<br /><br />我们至今还没有告诉NHibernate 去哪里连接数据库。最直接的办法是在你的应用程序的配置文件里设置一个NHibernate配置节。这和在Hibernate里使用属性文件是等价的。如下配置：<br /><br /><br />&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;configuration&gt;<br />&lt;configSections&gt;<br />&lt;section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /&gt;<br />&lt;/configSections&gt;<br /><br />&lt;nhibernate&gt;<br />&lt;add <br />key="hibernate.connection.provider" <br />value="NHibernate.Connection.DriverConnectionProvider" <br />/&gt;<br />&lt;add <br />key="hibernate.dialect" <br />value="NHibernate.Dialect.MsSql2000Dialect" <br />/&gt;<br />&lt;add <br />key="hibernate.connection.driver_class" <br />value="NHibernate.Driver.SqlClientDriver" <br />/&gt;<br />&lt;add <br />key="hibernate.connection.connection_string" <br />value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI" <br />/&gt;<br />&lt;/nhibernate&gt;<br />&lt;/configuration&gt;<br /><br />上面的例子里用了SqlClient 驱动，在本地连接名称为NHibernate 的数据库，提供用户名和密码。那里有一堆属性你需要调整来确定如何让NHibernate来访问数据库。再次说明，你可以在文档里获取更多信息。<br /><br />请注意以上的配置里并没有涉及到log4net的配置信息。NHibernate使用log4net来记录内部发生的一切。在一个应用程序产品里，在你特定环境里，我推荐配置log4net，并为NHibernate设置一定的日志级别。<br /><br />第五步：开始展现NHibernate的魔力<br /><br /><br /><br />所有艰苦的工作已经完成。你将有以下内容<br /><br />User.cs ----你需要持久化的C#类<br /><br />User.hbm.xml ----你的NHibernate映射文件<br /><br />App.config ---对ADO.NET连接的配置信息（如果你愿意，你可以在代码中实现）。<br /><br />你的数据库里有一张User表。<br /><br /><br /><br />现在可以在你的代码中恰当简洁的使用NHibernate。简化的版本如下<br /><br />创建一个Configuration对象 <br />让Configuration知道你将存储何种类型的对象 <br />为你选择的数据库创建一个Session对象 <br />Load，Save和Query你的对象 <br />通过Session的Flush()方法将对象提交给数据库。<br /><br /><br />为了让你更清晰，我们来看一些代码。<br /><br />首先，创建一个Configuration对象<br /><br />Configuration对象能够解析所有.Net对象和后台数据库中的映射关系。<br /><br /><br /><br /><br />Configuration cfg = new Configuration();<br />cfg.AddAssembly("NHibernate.Examples");<br /><br />Configuration对象会搜索装配件里的任何以hbm.xml 结尾的文件。还有其他方法加载映射文件，但这种方式是最简单的。<br /><br />下一步，创建一个Session对象<br /><br />ISession对象提供一个到后台数据库的连接，ITransaction对象提供一个可以被NHibernate管理的事务。<br /><br /><br /><br /><br />ISessionFactory factory = cfg.BuildSessionFactory();<br />ISession session = factory.OpenSession();<br />ITransaction transaction = session.BeginTransaction();<br /><br /><br /><br />接着来Load, Save和Query你的对象<br /><br />现在你可以用使用传统的.Net方法来操纵对象。你想保存一个新对象到数据库吗？尝试下面的方法：<br /><br /><br />User newUser = new User();<br />newUser.Id = "joe_cool";<br />newUser.UserName = "Joseph Cool";<br />newUser.Password = "abc123";<br />newUser.EmailAddress = "joe@cool.com";<br />newUser.LastLogon = DateTime.Now;<br /><br />// Tell NHibernate that this object should be saved<br />session.Save(newUser);<br /><br />// commit all of the changes to the DB and close the ISession<br />transaction.Commit();<br />session.Close();<br /><br /><br />正如你所看到的，关于NHiberante重要的事情是如此简单。继续并且查询你的数据库，验证一下User表里的新记录。现在重要的事情就是你去操心业务对象并在进行处理的时候告诉NHibernate就可以了。<br /><br /><br /><br />让我们来告诉你，当你有一个UserID的时候如何获取对象（举例说，登陆你的网站的时候）。仅仅一句话就可以打开Session，传入key就可以了<br /><br /><br /><br /><br />// open another session to retrieve the just inserted user<br />session = factory.OpenSession();<br /><br />User joeCool = (User)session.Load(typeof(User), "joe_cool");<br /><br /><br /><br />你所获取的User对象还在生存周期内！改变它的属性，并通过Flush()持久化到数据库。<br /><br /><br />// set Joe Cool's Last Login property<br />joeCool.LastLogon = DateTime.Now;<br /><br />// flush the changes from the Session to the Database<br />session.Flush();<br /><br /><br /><br /><br /><br />你所要做的就是通过NHibernate来进行你需要的改变，并调用Session的Flush()方法提交。验证一下数据库，查查用户ID为”joe_cool”的记录中”LastLogon”的更改。<br /><br /><br /><br />还有更好的，你可以以System.Collections.IList的方式来获取从表中的对象。如下<br /><br /><br />IList userList = session.CreateCriteria(typeof(User)).List();<br />foreach(User user in userList)<br />{<br />System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);<br />}<br /><br />这个查询将会返回所有表记录。往往你需要做更多的控制，比如说获取从March 14, 2004 10:00 PM　以后登陆的用户，如下：<br /><br />IList recentUsers = session.CreateCriteria(typeof(User))<br />.Add(Expression.Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))<br />.List();<br /><br />foreach(User user in recentUsers)<br />{<br />System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);<br />}<br /><br /><br />文档里还有一堆健壮的查询方式让你调用，这里仅仅让你对NHibernate所提供的强有力的工具有一定的了解。<br /><br />最后调用Session对象的Close()方法，释放NHibernate所使用的ADO.Net连接资源<br /><br /><br />// tell NHibernate to close this Session<br />session.Close();<br /><br /><br /><br /><br />更确切地说…<br /><br /><br /><br />你已经完成创建对象，持久化并通过条件查询或键值查询来返回它。相信你已经从中获得快乐。<br /><br />现在你对NHibernate有了大致的了解，如果你能仔细阅读大量来自Hibernate 2.0.3文档,你将获得帮助（NHibernate文档还在早期阶段，现在还仅仅是对Hibernate的拷贝）。<br /><br /><br /><br />Enjoy! And Happy NHibernating! <br /><br />Mike Doerfler<br /><br /><br /><br />再次说明，所有的权利来自Glen Smith的A Hitchhiker's Guide to Hibernate<br /><br /><div style="OVERFLOW-X: auto; WIDTH: 100%"><a href="http://bijia.anyflex.cn/uploads/200510/24_211004_o_nhibernateuml.jpg" target="_blank"><img alt="uploads/200510/24_211004_o_nhibernateuml.jpg" src="http://bijia.anyflex.cn/uploads/200510/24_211004_o_nhibernateuml.jpg" /></a></div><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/58184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-14 14:31 <a href="http://www.blogjava.net/wuxufeng8080/articles/58184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用System.Net.Mail发送email</title><link>http://www.blogjava.net/wuxufeng8080/articles/57890.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 13 Jul 2006 00:00:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/57890.html</guid><description><![CDATA[
		<p>刚刚看到一篇关于在.NET 中发送Email的文章《从asp.net页面发送电子邮件》看到使用的还是System.Web.Mail命名空间下的类。我们都知道，在.NET 1.1下大部分都是使用这个命名空间下的类来发送邮件的，使用SmtpMail的Send静态方法可以很简单的发送Email，但由于这个类调用的是Windows2000版本以上的操作系统的CDO组件来发送邮件，不管是什么错误都会提示是CDO.Message对象无法访问或其它的CDO.Message异常，我们无法得到很比较详细的异常信息，给我们的调试带来的很大的不便。特别是当我们需要Smtp验证的话，还要给MailMessage添加三个邮件头定义，相对来说还是比较麻烦的。那么在.NET 2.0下，发送Email的功能已经被设计得非常好了，利用System.Net.Mail空间下的类可以让我们很简单地发送各种Email。但是为了兼容原来的版本，所以System.Web.Mail空间并没有被删除，这个空间下的类也都被打上Obsolete标记了，使用.NET 2.0 类编译的话都会提示说，推荐使用System.Web.Mail空间的类来代替。 </p>
		<p>下面我们就来看看需要做哪些事才能发送Email的，在这里我也找到了园子里一篇关于.NET 2.0发送Email的文章《基于 .NET 2.0 System.Net.Mail namespace 的邮件发送组件》，它涵盖了发送和接收邮件。在本篇里，我们只讨论如何发送的，我感觉它那边好像没有真正用好配置文件。还要自己给SmtpClient指定Stmp帐号的一些信息，事实上我们只需要通过web.config(或app.config)配置一下我们将要使用的Smtp帐号： </p>
		<p>&lt;configuration&gt; </p>
		<p>    &lt;system.net&gt; </p>
		<p>        &lt;mailSettings&gt; </p>
		<p>            &lt;smtp from="<a href="mailto:hjf1223@tom.com">hjf1223@tom.com</a>"&gt; </p>
		<p>                &lt;network host="smtp.tom.com" password=" " port="25" userName="hjf1223" defaultCredentials="false"/&gt; </p>
		<p>            &lt;/smtp&gt; </p>
		<p>        &lt;/mailSettings&gt; </p>
		<p>    &lt;/system.net&gt; </p>
		<p>&lt;/configuration&gt; </p>
		<p>.NET 2.0的配置系统就是强大，我们完全不用去参考任何的资料就可以非常简单的写出如上的配置了。如上，from属性就是你将要从哪个邮箱发送Email，host就是smtp服务器地址了，password,port,userName就不用多说了，至于defaultCredentials就需要注意了，当我们不需要smtp服务器验证发送用户时，就将它设为false，反之就设为true，当前大多数SMTP服务器都需要用户验证的，所以一般情况下都就设为true，让它使用我们配置好的用户名和密码去验证是否是合法用户。 </p>
		<p>配置文件写好了，接一来就是程序如何调用了，等我写出如下的发送Email后，你就感到非常奇怪，真的就这么简单吗？是的，就是这么简单，来看看： </p>
		<p>        MailMessage m_message = new MailMessage(); </p>
		<p>m_message.From = new MailAddress("<a href="mailto:hjf1223@tom.com">hjf1223@tom.com</a>"); </p>
		<p>m_message.To.Add(new MailAddress("<a href="mailto:hjf1223@gmail.com">hjf1223@gmail.com</a>")); </p>
		<p>m_message.Subject = "使用.NET 2.0发送邮件"; </p>
		<p>m_message.Body = "非常简单 "; </p>
		<p>SmtpClient m_smtpClient = new SmtpClient(); </p>
		<p>m_smtpClient.Send(m_message); </p>
		<p>我们甚至没有一句多余的代码，就是构造一个MailMessage对象，然后构造一个SmtpClient直接就利用它发送邮件了。比起原来的静态方法，没有多一句代码。这里有的朋友可能就要问了？那smtp帐户信息哪里来呢？其实你可以调试一下，这时候m_smtpClient对象里属性就是我们前面配置文件配置的值了。在构重一个SmtpClient时，会自动去读取system.net配置节下的值，如果用户有配置smtp信息的话，那么它将会被自动被始到当前的SmtpClient对象，进而利用它去发送Email。在.NET 2.0中发送邮件就只要做这么多工作了，而且非常稳定。 </p>
		<p>总结：虽然在.NET 2.0下，使用System.Web.Mail发送邮件很简单，在错误的时候也可以得到比较详细的异常信息，但是有时候出现的问题也会让你摸不着头脑。最经常出现的是，当你的机器有安装杀毒防火墙，有可能会发不出邮件，但是提示信息却让你无法诊断是哪里出问题了，大意是邮件发送被拒绝。出现这种事况是由于防火墙拒绝了我们对25端口的使用，从而造成无法与SMTP服务器正常通信。解决办法就是关闭它了，相信网上已经有很多的案例了。还有一点要特别注意，要发送邮件的机器必须是直接外网的，由于公司是通过代理上网，所以这个印象特别深。 上面的代码还有一点需要注意，MailMessage对象的From值必须和配置文件中From值是一样的，这里好像也可以不用设，大家可以试一下。 </p>
		<p>好了，附上代码，希望能对你有所帮助。</p>
		<p>
				<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;&lt;html&gt;  &lt;head&gt;        &lt;title&gt;Test&lt;/title&gt;    &lt;!--    &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;    --&gt;  &lt;/head&gt;    &lt;body&gt;    welcome to ivo  &lt;/body&gt;&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/57890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-13 08:00 <a href="http://www.blogjava.net/wuxufeng8080/articles/57890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp.net 生成RSS页面-（zt）</title><link>http://www.blogjava.net/wuxufeng8080/articles/57080.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 07 Jul 2006 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/57080.html</guid><description><![CDATA[
		<h2 class="diaryTitle"> </h2>
		<p>                                       
</p>
		<p>
		</p>
		<p>本文主要提供代码,创建自己的RSS,供别人订阅...</p>
		<p> </p>
		<br />
		<p>本文主要提供代码,创建自己的RSS,供别人订阅...</p>
		<p>--- RSS.aspx</p>
		<p>&lt;%@ Page language="c#" Codebehind="RSS.aspx.cs" AutoEventWireup="false" Inherits="Socent.RSS" %&gt;</p>
		<p>--- RSS.aspx.cs</p>
		<p>using System;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Web;<br />using System.Web.SessionState;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.HtmlControls;</p>
		<p>namespace Socent<br />{<br /> /// &lt;summary&gt;<br /> ///  取得聚合文章<br /> /// &lt;/summary&gt;<br /> public class RSS : System.Web.UI.Page<br /> {<br />  Components.GenRSS gr = new Components.GenRSS(); // 实例化对象</p>
		<p>  string strRSS = "";</p>
		<p>  private void Page_Load(object sender, System.EventArgs e)<br />  {<br />   Response.ContentType = "application/xml"; // 输出并按xml数据显示<br />   Response.Write (GetRSS());<br />  }</p>
		<p>  /// &lt;summary&gt;<br />  /// 取得聚合文章<br />  /// &lt;/summary&gt;<br />  public string GetRSS()<br />  {  <br />   DataSet ds = gr.GenerateRSS(); // 调用GenerateRSS()方法,获得数据</p>
		<p>   strRSS = strRSS + "&lt;rss version=\"2.0\"&gt;";<br />   strRSS = strRSS + "&lt;channel&gt;";<br />   strRSS = strRSS + "&lt;title&gt;土人制造&lt;/title&gt;";<br />   strRSS = strRSS + "&lt;link&gt;http://www.socent.com&lt;/link&gt;";<br />   strRSS = strRSS + "&lt;description&gt;土人制造&lt;/description&gt;";<br />   for(int i = 0; i &lt; ds.Tables[0].Rows.Count; i++)<br />   {<br />    strRSS = strRSS + "&lt;item&gt;";<br />    strRSS = strRSS + "&lt;title&gt;&lt;![CDATA["+ds.Tables[0].Rows[i]["Title"]+"]]&gt;&lt;/title&gt;";<br />    strRSS = strRSS + "&lt;link&gt;http://www.socent.com/ArticleShow@"+ds.Tables[0].Rows[i]["ID"]+".html&lt;/link&gt; ";<br />    strRSS = strRSS + "&lt;description&gt;&lt;![CDATA["+ds.Tables[0].Rows[i]["Description"]+"]]&gt;&lt;/description&gt;";<br />    strRSS = strRSS + "&lt;copyright&gt;土人制造&lt;/copyright&gt;";<br />    strRSS = strRSS + "&lt;pubDate&gt;"+Convert.ToDateTime(ds.Tables[0].Rows[i]["AddDate"].ToString()).ToString("yyyy-MM-dd HH:mm")+"&lt;/pubDate&gt;";<br />    strRSS = strRSS + "&lt;comments&gt;http://www.socent.com/CommentShow@"+ds.Tables[0].Rows[i]["ID"]+".html&lt;/comments&gt;";<br />    strRSS = strRSS + "&lt;/item&gt;";<br />   }<br />   strRSS = strRSS + "&lt;/channel&gt;";<br />   strRSS = strRSS + "&lt;/rss&gt;";<br />  <br />   return strRSS;<br />  }</p>
		<p>  #region Web 窗体设计器生成的代码<br />  override protected void OnInit(EventArgs e)<br />  {<br />   //<br />   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。<br />   //<br />   InitializeComponent();<br />   base.OnInit(e);<br />  }<br /> <br />  /// &lt;summary&gt;<br />  /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br />  /// 此方法的内容。<br />  /// &lt;/summary&gt;<br />  private void InitializeComponent()<br />  {   <br />   this.Load += new System.EventHandler(this.Page_Load);<br />  }<br />  #endregion<br /> }<br />}</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/57080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-07 10:02 <a href="http://www.blogjava.net/wuxufeng8080/articles/57080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TreeView 四技</title><link>http://www.blogjava.net/wuxufeng8080/articles/57059.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 07 Jul 2006 00:03:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/57059.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/57059.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/57059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/57059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/57059.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 0. 背景故事								      现在的东西动不动就用G来算，一眨眼的功夫，我那100G的硬盘已拥挤不已了，但还有很多东西想放进来啊，怎么办？好吧，现在 DVD 刻录机的价格已经平民化了，我买了一个来舒缓紧张的硬盘。这下好了，硬盘上的可用空间总是足以让我下载想要的大块头了。没过多久，我刻录的 DVD 就堆积成山，成为我房间的一道景物。为了管理这座“山”，我决定写一个 DVD 管...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/57059.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/57059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-07-07 08:03 <a href="http://www.blogjava.net/wuxufeng8080/articles/57059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>