如何指定手持设备的根?

时间:2014-03-04 19:25:17

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

我需要递归搜索手持设备,查找设备上任何符合特定模式的文件(例如“ Platypus .XML”)。

要将设备的根目录传递给我的目录遍历方法,是否要传递“\”或其他内容?

在Windows资源管理器中,设备为“J:\” - 但我知道这不起作用,因为它不会映射到每个人的J。

Windows资源管理器中设备的全名如下:

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

...但同样地,每个人的设备都会有不同的名称,因此无效。

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

更新

更具体地说,根据我的情况,如果Windows资源管理器说有问题的文件夹是“计算机\ Goliath的设备\应用程序\ ccr ”,以下是我需要以编程方式指定该文件夹:“< EM> \应用程序\ 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));

......我明白了:

serialnum ==; clientVer ==; Win32Exception

而具有以下内容:

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

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

......我明白了:

serialnum ==; clientVer ==; 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中,我需要阅读(并且可能替换)的版本信息在另一个“子设备”...

如果不清楚,这是一个尖叫:

enter image description here

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

更新5

使用此代码:

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

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

是的,在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下的注册表中标识挂载名称。