【问题标题】:How does one designate the root of a handheld device?如何指定手持设备的根?
【发布时间】:2014-03-04 19:25:16
【问题描述】:

我需要递归地在手持设备上搜索设备上任何位置遵循特定模式的任何文件(例如“Platypus.XML”)。

要将设备的根目录传递给我的目录遍历方法,是传递“\”还是别的什么?

在 Windows 资源管理器中,设备是“J:\” - 但我知道这行不通,因为它不会为所有人映射到 J。

设备在 Windows 资源管理器中的全名类似于:

Duckbill (\\LEXINGTON\dev\Xmen\Miguel\Installs) (J:)

...但同样,每个人的设备名称都不同,所以这行不通。

所以是用“\”指定的根文件夹还是我可以调用一些方法来获取该指示符,例如 Environment.SpecialFolder.Startup 或...???

更新

更具体地说,如果 Windows 资源管理器说有问题的文件夹是“Computer\Goliath's Device\Application\ccr”,那么我需要以编程方式指定该文件夹:“\Application\ccr"?

更新 2

以下代码导致 FileNotFound 异常,然后 .exe 在手持设备上崩溃:

string clientVer = HHSUtils.GetFileVersion(@"\\Platypus.exe");

public static string GetFileVersion(string filePath)
{
        const int VERSION_DEPTH = 4;
        var version = NativeFile.GetFileInfo(filePath);
        return version.Version.ToString(VERSION_DEPTH);
}

更新 3

以下内容:

string serNum = User.getSerialNo();
string clientVer = DuckbillUtils.GetFileVersion("\\Application\\ccr\\Platypus.exe");
MessageBox.Show(string.Format("serial num == {0}; clientVer == {1}", serNum, clientVer));

...我明白了:

序列号 == ; 客户端版本 == ; Win32异常

而以下内容:

string clientVer = DuckbillUtils.GetFileVersion(@"\\Application\ccr\Platypus.exe");

(其他代码行相同;逐字字符串唯一的区别)

...我明白了:

序列号 == ; 客户端版本 == ; FileNotFoundException

更新 4

我找到了一些很好的信息here,并基于那里的代码:

string modulePath = this.GetType().Assembly.GetModules()[0].FullyQualifiedName;

...这是它为我的 .exe 显示的内容:

"\Program Files\HHS\HHS.exe"

...然后我尝试检查位于(在不同的子文件夹中,但共享相同的祖父文件夹)的“表亲”exe:

@"\\Program Files\\LocateNLaunch\\LocateNLaunch.exe"

...但是 GetFileVersion() 方法没有给我任何东西。

无论如何,我真正想要检查的文件(对于它的版本信息)在其中,而不是文件夹本身,但是由于缺乏知识而称为“子设备”(我不知道)不知道术语是什么,但在 Windows 资源管理器中,设备分为“子设备”或“超级文件夹”,它们下面有文件夹)。如何指示/指定您想要访问的内容?我的 .exe 在一个“子设备”中,而我需要读取(并可能替换)其版本信息的 .exe 在另一个“子设备”中...

如果不清楚,这里有一个尖叫声:

那么如何将我的代码指向 Application subdevice\sscs 文件夹下的那个文件 (HHSetup.exe)?

更新 5

使用此代码:

string clientVer = HHSUtils.GetFileVersion(@"\Application\sscs\HHSetup.exe");

...我仍然从该调用中得到一个空字符串,然后是 Win32Exception。

【问题讨论】:

    标签: compact-framework directory windows-ce special-folders handheld


    【解决方案1】:

    设备名称无关紧要,它纯粹是一个 Explorer Shell 扩展技巧。在设备本身上,根始终是\。所有路径都必须从该根目录完全限定。

    我建议在获取本机版本信息之前进行一些测试。比如:

    if(!File.Exists(path))
    {
        // don't try, report an error or whatever
    }
    else
    {
        var version = GetFileInfo(path);
    }
    

    var fi = new FileInfo(path);
    if(!fi.Exists)
    {
        // don't try, report an error or whatever
    }
    else
    {
        var version = GetFileInfo(fi.FullName);
    }
    

    【讨论】:

    • 如何导航到“子设备”(或其他任何名称)?请参阅更新 4。
    • 我猜它被称为“内置闪存驱动器”?
    • 它们只是作为文件夹安装在根目录上。它们的访问方式与任何其他文件夹没有什么不同。
    【解决方案2】:

    是的,在 CE 中,所有存储的根是 \。详情见这里:Understanding the File System Architecture in Windows CE .NET。特别是:

    Windows CE .NET 文件系统是一种灵活的模块化设计,允许自定义文件系统、过滤器和各种不同的块设备类型。文件系统和所有与文件相关的 API 由 FileSys.exe 进程管理。这个模块实现了对象存储和存储管理器(我们稍后将研究对象存储)并将所有文件系统统一到一个根目录下的单个系统中,“\”。在 Windows CE .NET 中,所有文件和文件系统都存在于以“\”为根的单个命名空间中。所有文件都使用从层次树中的根开始的唯一路径进行标识。

    设备可以挂载到根文件系统,挂载名称在注册表中的HKEY_LOCAL_MACHINE\System\StorageManager\Profiles下标识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      相关资源
      最近更新 更多