Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取本地帐户ini文件_C#_.net_Vb6_Ini - Fatal编程技术网

C# 读取本地帐户ini文件

C# 读取本地帐户ini文件,c#,.net,vb6,ini,C#,.net,Vb6,Ini,我有一个旧的VB6应用程序,它将数据保存到ini文件中,该文件应该位于windows文件夹中。在VB6代码中,我只引用文件名(没有路径),它由Windows自动定位在Windows文件夹中。但是,在Windows 8和公司网络上,Windows将文件移动到用户帐户,因此它显示在\Users\username\AppData文件夹结构下 VB6对此毫不在意,它总是读取“ipmdata.ini”,并通过Windows从AppData文件夹中获取特定于用户的数据 但是,我现在需要从C#应用程序读取相同

我有一个旧的VB6应用程序,它将数据保存到ini文件中,该文件应该位于windows文件夹中。在VB6代码中,我只引用文件名(没有路径),它由Windows自动定位在Windows文件夹中。但是,在Windows 8和公司网络上,Windows将文件移动到用户帐户,因此它显示在\Users\username\AppData文件夹结构下

VB6对此毫不在意,它总是读取“ipmdata.ini”,并通过Windows从AppData文件夹中获取特定于用户的数据

但是,我现在需要从C#应用程序读取相同的ini文件。因此,我添加了GetPrivateProfileString的定义,并用我给VB6的相同参数提供了它。C#代码总是从windows文件夹中的文件读取,而不是VB6正在读取和写入的同一文件

你知道我如何使C#调用与VB6调用相同的API吗

我曾尝试针对Framework2.0开发.Net应用程序,编译到x86,并在最终可执行文件上运行editbin设置/TSAWARE:NO(尽管我不知道如何检查它是否有效-它只是没有“失败”)

VB6代码由声明和读取组成:

Public Declare Function GetPrivateProfileString Lib "kernel32" _
     Alias "GetPrivateProfileStringA" ( _
     ByVal lpApplicationName As String, _
     ByVal lpKeyName As Any, _
     ByVal lpDefault As String, _
     ByVal lpReturnedString As String, _
     ByVal nSize As Long, _
     ByVal lpFileName As String) As Long

   nRetcode = GetPrivateProfileString("PCD", "TemplateFolder", "", sTemp, 512, "mystuff.ini")
c#应用程序中的等效代码包括:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
    static extern uint GetPrivateProfileString(
       string lpAppName,
       string lpKeyName,
       string lpDefault,
       StringBuilder lpReturnedString,
       uint nSize,
       string lpFileName);

        StringBuilder sb = new StringBuilder(2048);
        GetPrivateProfileString("PCD", "TemplateFolder", "", sb, 2048, "mystuff.ini");

测试程序中没有其他内容,只有读取ini文件的代码。C代码读取当前在my\Windows文件夹中的ini,VB6代码读取\users\user\appdata\virtualstore\Windows文件夹中的ini。

您是否尝试指定完整路径

GetPrivateProfileString("PCD", "TemplateFolder", "", sb, 2048, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mystuff.ini");

这里有很多误解

UAC早在2006年就开始使用WindowsVista,而不是Windows8

文件系统虚拟化不是一个应用程序特性,而是一个bug。微软明确警告程序员不要依赖它

您的.Net程序可能有一个清单将其标记为Vista感知,在这种情况下,虚拟化永远不会应用

这似乎也是


基本上,真正的答案是修复您的程序,使其不需要虚拟化。

如果您在当前使用的VB和C中显示用于读取ini文件的相关代码,将会有所帮助。如果您只使用VB中的
私有声明函数GetPrivateProfileString Lib“kernel32”
[DllImport(“kernel32.dll”]静态外部uint GetPrivateProfileString())在C/X中,我怀疑API调用会导致这种行为,因为它们是相同的。也许有其他代码干扰路径,或者API调用在当前目录中看起来,对于不同的应用程序可能是不同的。此外,当移植一个依赖于此的应用程序时,您可能会考虑替换它们。正在将应用程序移植到.NET为什么不也移植.ini?您可以将设置添加到app.config文件中。配置文件与应用程序存储在同一文件夹中。下面是一篇MSDN文章,其中有更详细的解释。抱歉,伙计们,我没有收到任何评论通知。我将用代码更新帖子。不过,作为测试,我将其剥离为绝对最小值。因此,有一个测试VB6程序,由一个声明和一个C#程序组成,代码相同。我没有移植该应用程序。我需要在.Net中执行一个新要求。旧的VB6应用程序将保持原样。仅供参考,我现在已将清单嵌入到应用程序中,并显式更改了安全选项我还将程序更改为在尝试读取ini文件之前写入ini文件。遗憾的是,没有区别;VB6读取虚拟文件,.Net读取真实文件。我想我会先编写代码查找虚拟ini文件,如果找不到虚拟文件,则只读取windows文件。这是一个垃圾解决方案but可能是我所拥有的最好的。是的,无论我是否指定完整路径。@sab我不明白,因为我在发布之前测试了它,它从预期的文件夹中抓取。您所做的是不同的。您专门针对AppData文件夹。VB6代码写入它认为是Windows文件夹的内容,而Windows re指向虚拟化文件夹。C#中的同一代码不会被重定向。我需要实现的是让Windows以与VB6相同的方式处理我的.net代码,并将其重定向到虚拟化Windows文件夹。我同意,这对我来说就像一个bug。遗憾的是,这是一个我需要面对的bug。我将.net应用程序修改为32位,并添加了一个清单这本应该启用虚拟化。但没有起作用。我的感觉是,当编译程序时,后台正在发生其他事情,从而启用虚拟化。我在虚拟机上有一个VS2008的旧副本,将尝试在那里构建应用程序,看看它是否有任何不同。虚拟化不是我想要使用的东西,也不是我想要的东西这是我要求的。这是强加给我的。然后只是复制文件虚拟化过程的行为,而不是尝试使用虚拟化。查找虚拟化的INI,如果不存在,则通过从Windows文件夹复制该INI来创建它。这也带来了它自己的问题,因为api没有找到该INI的方法虚拟化文件夹被调用,我无法硬编码名称,因为它可以本地化。对于此应用程序,我想我从包含AppData的任何文件夹开始,并执行递归搜索,直到找到ini文件或找不到位置为止。对于此特定应用程序,我可以不受影响。如果使用已发布的接口。