Installation 在Windows Mobile上安装后,SDF文件始终创建为只读

Installation 在Windows Mobile上安装后,SDF文件始终创建为只读,installation,windows-mobile,sql-server-ce,windows-ce,Installation,Windows Mobile,Sql Server Ce,Windows Ce,我的windows mobile应用程序有一个本地数据库文件(database.sdf)。用户在其设备中安装CAB文件时创建的文件。安装工作正常,但当我尝试使用Query Analyzer打开SDF或当应用程序尝试访问数据库时,我会收到一条消息 “不允许访问数据库文件”(25039) 当我使用Windows资源管理器检查权限时(设备已停靠),该文件被标记为只读。如果删除只读复选框一切正常,我可以打开、编辑并向数据库添加记录 如何使文件在默认情况下不为只读?您可以在应用程序启动期间以编程方式验证该

我的windows mobile应用程序有一个本地数据库文件(
database.sdf
)。用户在其设备中安装CAB文件时创建的文件。安装工作正常,但当我尝试使用Query Analyzer打开SDF或当应用程序尝试访问数据库时,我会收到一条消息

“不允许访问数据库文件”(25039)

当我使用Windows资源管理器检查权限时(设备已停靠),该文件被标记为只读。如果删除只读复选框一切正常,我可以打开、编辑并向数据库添加记录


如何使文件在默认情况下不为只读?

您可以在应用程序启动期间以编程方式验证该属性。在C#/.netcf中,它将是:

if (File.GetAttributes(path) & FileAttributes.ReadOnly == FileAttributes.ReadOnly)
    File.SetAttributes(path, File.GetAttributes(path) & ~FileAttributes.ReadOnly);

您可以在应用程序启动期间以编程方式验证该属性。在C#/.netcf中,它将是:

if (File.GetAttributes(path) & FileAttributes.ReadOnly == FileAttributes.ReadOnly)
    File.SetAttributes(path, File.GetAttributes(path) & ~FileAttributes.ReadOnly);

除了yms提供的答案之外,我还将试图弄清楚为什么文件只是在一开始就被创建为就绪文件

它是通过您添加到安装过程中的自定义安装程序dll创建的吗?还是通过cabwiz或VS中的安装程序项目将其打包到.CAB文件中

如果是前者,请检查该安装程序库的源代码。
如果是后者,请检查源文件。如果将SDF包含在Visual Studio项目中,并将该项目签入某种类型的源代码管理,则很可能在将其签入源代码存储库时,它在磁盘上是只读的,当它打包到.CAB中时。

除了yms提供的答案之外,我会试图弄清楚为什么文件只是在一开始就被创建为就绪文件

它是通过您添加到安装过程中的自定义安装程序dll创建的吗?还是通过cabwiz或VS中的安装程序项目将其打包到.CAB文件中

如果是前者,请检查该安装程序库的源代码。
如果是后者,请检查源文件。如果将SDF包含在Visual Studio项目中,并将该项目签入某种类型的源代码管理,则当它签入源代码存储库时,很可能在磁盘上是只读的,当它打包到.CAB中时。

我知道这是旧的,但如果Andrew实际使用的是.netcf,它没有File.GetAttributes。相反,他应该使用

        FileInfo info = new FileInfo(pathToFile)
        if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            info.Attributes &=~ FileAttributes.ReadOnly;

我知道这很旧,但如果Andrew实际使用的是.netcf,它就没有File.GetAttributes。相反,他应该使用

        FileInfo info = new FileInfo(pathToFile)
        if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            info.Attributes &=~ FileAttributes.ReadOnly;