路径的设置及资源文件(转载)

相对路径与绝对路径,

本文来自:http://www.cnblogs.com/sutengcn/archive/2008/08/17/201993.html
1,相对路径与绝对路径
        文档路径类型一共有三种:绝对路径、根相对路径和文档相对路径。

  绝对路径是包括服务器协议(在本例中为http协议)的完全路径,比如“洪恩在线——电脑乐园”,完全路径为:http://www.hongen.com/pc/index.htm,如果所要链接当前站点之外的文档,就必须使用绝对路径。

  相对路径包括根相对路径(Site Root)和文档相对路径(Document)两种。
  
前面我们讲过,在本地磁盘上编辑网页时,需要选定一个文件夹来定义本地站点,模拟服务器上的根文件夹,系统就根据这个文件夹来确定所有链接的本地文件位置,而跟相对路径中的根就是指这个文件夹。

  跟相对路径(也称相对跟目录)的路径以“/”开头,路径是从当前站点的根目录开始计算。比如我们前面建的D盘myweb目录就是名为“myweb”的站点,这时“/index.htm”路径,就表示文件位置为D:\myweb\index.htm。根相对路径适用于链接内容频繁更换环境中的文件,这样即使站点中的文件被移动了,其链接仍可以生效。

  如果目录结构过深,在引用根目录下的文件时,用跟相对路径会更好些。比如某一个网页文件中引用根目录下img目录中的一个图,在当前网页中用文档相对路径表示为:“http://www.cnblogs.com/http://www.cnblogs.com/../img/a.gif”,而用跟相对路径只要表示为“/img/a.gif”就行了。

  注意:在预览文件时,用根相对路径链接的内容在本地浏览器中不会显示出来,这是因为浏览器不承认站点的根文件夹为服务器。

  这时我们可以将站点的根目录虚拟为一个盘。比如要浏览D:\myweb下的文件,可以选择Windows“开始”菜单中的“运行”,弹出运行对话框

  输入“SUBST I: d:\myweb”,D盘下的myweb文件夹就被虚拟为I盘,用浏览器查看I盘下网页,用根相对路径链接的内容都可以正常显示了。

  文档相对路径就是指包含当前文档的文件夹,也就是以当前网页所在文件夹为基础开始计算路径。比如,当前网页所在位置为D:\myweb\mypic,那么:

  “a.htm”就表示D:\myweb\mypic\a.htm;

  “../a.htm”相当于D:\myweb\a.htm,其中“../”表示当前文件夹上一级文件夹。

  “img/a.gif”是指D:\myweb\mypic\img\a.gif,其中“img/”意思是当前文件夹下名为img文件夹。

  文档相对路径是最简单的路径,一般多用于链接保存在同一文件夹中的文档

Silverlight中的“/”

本文来自:http://hi.baidu.com/liongg/blog/item/b91a495494e34152564e00b4.html

Silverlight2 现在支持的Image格式有jpg和png,部分png编码也不支持,同时有些png在xaml的design预览中不可见,但运行时可见。请看XAML markup中两行代码的异同:
<StackPanel Background="White" Orientation="Vertical">
        <Image x:Name="blue" Source="/images/blue.png" Stretch="None"/>
        <Image x:Name="green" Source="images/green.png" Stretch="None" />
</StackPanel>

反斜杠forward-slash?有没有虾米区别呢?如图所示,名称为Resource测试示例解决方案资源管理器以及运行效果:以反斜杠开头的blue图片需要放在ClientBin目录下的相应文件夹里;不以反斜杠开头的green图片应该放在Resource目录下的相应文件夹里。这样才可正确引用,否则会发生ImageError。

 

 

 


为什么?两者都是相对路径,到底反斜杠带来了什么区别呢?反斜杠开头的相对路径,代表的相对位置是应用程序运行的根目录,即.xap压缩包内,若在这其中寻找不到要引用的文件,则相对路径的回退机制(fallback mechanism )自动在在.xap所在的目录,本例即为ClientBin目录中寻找加以引用。两个位置都没有,才会发生错误。不以"/"开头,则代表的相对位置是引用该图片的XAML文件所在的目录,本例即page.xaml文件所在的Resource目录。

那么究竟选择哪种方式呢?把xap文件重命名为zip文件,解压之,再用reflector反编译其中的dll文件,发现其包含了green图片,却没有blue图片。其实也很明显,blue所在的images文件夹与.xap同级,自然不会包含在内。由此可知,不以反斜杠开头的green图片嵌入到Silverlight程序中的xap文件直接下载到客户端,而blue图片则按需索取(on-demand),当显示时再去下载。当数据量较大时,不以反斜杠开头的方式加载程序的时间就过长,用户体验不好,以"/"开头自然就无此无虑,不过以反斜杠开头的话,在xaml中设计预览看不到,只有程序运行才可以看到。(若为了预览,可先从ClienBin那里复制一份放在page.xaml同级目录下供设计使用,程序发布时予以删除。)
         
除了在XAML中直接确定Image的Source URI,当然也可以在code-behind中确定,此时反斜杠的用法和XAML中相通。
C#:Image img = new Image();
img.Source = new BitmapImage(new Uri("test.jpg", UriKind.Relative));      //page.xaml所在目录下
//img.Source = new BitmapImage(new Uri("/test.jpg", UriKind.Relative)); //.xap所在目录下

话说要是使用诸如http://www.liongg.net/test.jpg之类绝对URI就没反斜杠什么事了。在代码中还可以利用Application.Current.Host.Source.AbsolutePath等方法,我试验下了,发觉太麻烦还没意思,不再多管。

再深入一点,甚至图片放在与page.xaml同级的文件夹下,一样可以使用反斜杠进行引用。只需要在相应图片的属性里,把Build Action选择为"Content"即可,不过该图片还是被放到.xap压缩包里了,这是后话,参见《Sivlerlight Resource 概览》。

Sivlerlight Resource 概览

图片,音频、视频,甚至XML和XAML等非执行数据文件都叫做资源,根据资源所处位置的不同而有所区别,先了解下Silverlight 应用程序的结构。

 

在.xap压缩包中,有一个Appmanifest.xaml文件,定义了打包的程序集和应用程序入口;一个application程序集;0个或多个library程序集;0个或多个资源文件,如图片、视频等。整个.xap在应用程序激活之前都已经下载到客户本地,而on-demand文件,顾名思义,需要的时候再予以加载。

 

 

由此可见,资源文件可分布在多个位置,如镶嵌入程序集内;在.xap压缩包内而不镶嵌入任何程序集内;不在程序集内也不在.xap内。当在工程中添加一个资源如pink.png图片时,右键之,选择属性,可以在“Build Action”中,分别选择Resource、Content 和 None 可使资源文件生成在对应上述三个位置。(官方文档说其他选项在Silverlight中没什么作用,但事实上Embedded Resource也是有作用的,见《用反射来动态加载XAML》)

 

 

 

在工程中引入资源文件,即引入在与page.xaml同目录下,默认的“Build Action”选项是“Resource”,即镶嵌入相应程序集内,这时引用该资源不应该以反斜杠开头。若把资源文件放在ClienBin同目录下,则相当于None,引用时需要以反斜杠开头。可参见《Silverlight Image Source URI》一文,理解是否以反斜杠开头的区别。

 

 

        不建议把资源文件放在page.xaml同目录下,然后选择“Build Action”为“None”,换句话说,若不想资源文件打包进.xap中,直接把资源文件放在ClienBin文件目录下。但可以把page.xaml同目录下的资源文件属性中的Build Action”改为“Content”,使其放在.xap压缩包中,方便.xap中多个程序集的共同使用。既然此时资源文件在.xap压缩包内,引用该文件则需要以反斜杠开头。这就是《Silverlight Image Source URI》一文最后提到的,为什么资源文件放在page.xaml同目录下,却可以使用反斜杠开头来引用。示例代码和运行结果如下。

<StackPanel Background="White" Orientation="Vertical">
        <Image x:Name="blue" Source="/images/blue.png" Stretch="None"/>
        <Image x:Name="green" Source="images/green.png" Stretch="None" />
        <Image x:Name="pink" Source="/images/pink.png" Stretch="None" />
</StackPanel>

对应Silverlight应用程序结构,本示例三个资源文件,ClientBin目录下(包含下级目录,只不过把所有Image都放在一个文件夹里了)的blue.png是按需索取的松散资源,没有镶嵌到任何程序集内;page.xaml同目录下的green.png的Build Action是Resource,最终其被生成在.xap压缩包内的dll文件中,即镶嵌到了application程序集中;而pink.png由于Build Action被更改为Content,生成后,其位于.xap压缩包内,(故而需要反斜杠开头来引用)但不在任何程序集。

posted @ 2013-01-31 11:13  于为  阅读(573)  评论(0编辑  收藏  举报