检索具有特殊字符的嵌入资源

本文关键字:嵌入资源 特殊字符 检索 | 更新日期: 2023-09-27 17:52:54

我在获取嵌入式资源的流时遇到了问题。大多数在线示例显示的路径可以通过将路径的斜杠更改为源(MyFolder/MyFile)的点来直接翻译。ext变成MyNamespace.MyFolder.MyFile.ext)。但是,当文件夹的名称中有点并且使用特殊字符时,手动获取资源名称不起作用。我试图找到一个函数,可以将路径转换为资源名称,因为Visual Studio在编译时重命名它们。

解决方案中的这些名称…

  1. 内容/jQuery.UI-1.8.2 jQuery.UI.css
  2. 脚本/jQuery-1.5.2 jQuery.js
  3. 脚本/jQuery.jPlayer-2.0.0 jQuery.jPlayer.js
  4. 脚本/jQuery.UI-1.8.2 jQuery.UI.js

  1. Content.jQuery.UI_1._8._2.jQuery.UI.css
  2. Scripts.jQuery_1._5._2.jQuery.js
  3. Scripts.jQuery.jPlayer_2._0._0.jQuery.jPlayer.js
  4. Scripts.jQuery.UI_1._8._12.jQuery.UI.js

斜杠被转换成圆点。但是,当在文件夹名称中使用点时,第一个点显然被视为扩展,其余点被更改为下划线前缀。这个逻辑并不适用于jQuery.js文件,虽然,也许是因为"扩展"是一个单一的数字?这里有一个函数可以翻译我到目前为止遇到的问题,但在jQuery.js路径上不起作用。

    protected String _GetResourceName( String[] zSegments )
    {
        String zResource = String.Empty;
        for ( int i = 0; i < zSegments.Length; i++ )
        {
            if ( i != ( zSegments.Length - 1 ))
            {
                int iPos = zSegments[i].IndexOf( '.' );
                if ( iPos != -1 )
                {
                    zSegments[i] = zSegments[i].Substring( 0, iPos + 1 )
                                 + zSegments[i].Substring( iPos + 1 ).Replace( ".", "._" );
                }
            }
            zResource += zSegments[i].Replace( '/', '.' ).Replace( '-', '_' );
        }
        return String.Concat( _zAssemblyName, zResource );
    }

是否有一个函数可以为我更改名称?这是什么?或者我在哪里可以找到所有的规则,这样我就可以自己写函数了?感谢您提供的任何帮助。

检索具有特殊字符的嵌入资源

这是一个很晚的回答…但由于这是谷歌上的第一次点击,我将发布我发现的!

你可以强制编译器按你想要的命名嵌入的资源;这将从一开始就解决这个问题…您只需要编辑您的csproj文件,如果您想要通配符,您通常会这样做!我是这样做的:

<EmbeddedResource Include="$(SolutionDir)'somefolder'**">
  <Link>somefolder'%(RecursiveDir)%(Filename)%(Extension)</Link>
  <LogicalName>somefolder:'%(RecursiveDir)%(Filename)%(Extension)</LogicalName>
</EmbeddedResource>

在这种情况下,我告诉Visual studio,我希望"某些文件夹"中的所有文件都作为嵌入资源导入。我还希望它们显示在"一些文件夹"下,在VS解决方案资源管理器(这是链接标签)。最后,在编译它们时,我希望它们的名称和地址与它们在我的磁盘上的名称和地址完全相同,只使用"somefolder:'"前缀。

这是我想出的解决问题的方法。我仍然对更好的方法持开放态度,因为这是一个hack(但似乎与当前的规范是准确的)。该函数需要一个Uri的段来处理(当处理web请求时是LocalPath)。示例呼叫如下…

    protected String _GetResourceName( String[] zSegments )
    {
        // Initialize the resource string to return.
        String zResource = String.Empty;
        // Initialize the variables for the dot- and find position.
        int iDotPos, iFindPos;
        // Loop through the segments of the provided Uri.
        for ( int i = 0; i < zSegments.Length; i++ )
        {
            // Find the first occurrence of the dot character.
            iDotPos = zSegments[i].IndexOf( '.' );
            // Check if this segment is a folder segment.
            if ( i < zSegments.Length - 1 )
            {
                // A dash in a folder segment will cause each following dot occurrence to be appended with an underscore.
                if (( iFindPos = zSegments[i].IndexOf( '-' )) != -1 && iDotPos != -1 )
                {
                    zSegments[i] = zSegments[i].Substring( 0, iFindPos + 1 ) + zSegments[i].Substring( iFindPos + 1 ).Replace( ".", "._" );
                }
                // A dash is replaced with an underscore when no underscores are in the name or a dot occurrence is before it.
                //if (( iFindPos = zSegments[i].IndexOf( '_' )) == -1 || ( iDotPos >= 0 && iDotPos < iFindPos ))
                {
                    zSegments[i] = zSegments[i].Replace( '-', '_' );
                }
            }
            // Each slash is replaced by a dot.
            zResource += zSegments[i].Replace( '/', '.' );
        }
        // Return the assembly name with the resource name.
        return String.Concat( _zAssemblyName, zResource );
    }

示例调用. .

    var testResourceName = _GetResourceName( new String[] {
        "/",
        "Scripts/",
        "jQuery.UI-1.8.12/",
        "jQuery-_.UI.js"
    });

嗯…这是一个黑客,但我想它应该工作。只需在每个包含资源的目录中定义一个空的"Marker"类,然后获取其类型的FullName,从end中删除类名,然后就可以解码路径了。

string path = (new MarkerClass()).GetType().FullName.Replace(".MarkerClass", "");

我肯定有"更好"的方法去做……用更多的代码行;这个的优点是微软在做改动的时候会维护它;-)

欢呼。基斯。

这里也是一个迟来的答案,在我自己尝试之前我谷歌了一下,最终我不得不。

这是我想到的解决方案:

    public string ProcessFolderDash(string path)
    {
        int dotCount = path.Split('/').Length - 1; // Gets the count of slashes
        int dotCountLoop = 1; // Placeholder
        string[] absolutepath = path.Split('/');
        for (int i = 0; i < absolutepath.Length; i++)
        {
            if (dotCountLoop <= dotCount) // check to see if its a file
            {
                absolutepath[i] = absolutepath[i].Replace("-", "_");
            }
            dotCountLoop++;
        }
        return String.Join("/", absolutepath);
    }