我一直在使用一个基本上设计为数字闪存卡的简单程序。理想情况下,我希望程序是可移植的。我正在尝试获取当前目录。我的设置是这样的:获取当前目录
我有一个FileIO.cs方法读取currentDir /数据。然后我有一个winform,它调用该方法并检索文件夹列表的字符串[]数组。这两种方法都是公共静态的。然后我有一个单独的按钮来在窗体上创建控件。
问题: 我已清洗/重建所述溶液,并使用调试器被;该程序从C:\ Users \ user \ a \ b \ c \ solution \ bin \ debug运行。我为验证此数据而创建的控件(radioButton)告诉我'currentDir'是C:\ Users \ user,而不是程序当前目录。
注: 我手动创建调试\数据和数据文件夹内的4个文件夹,所以我敢肯定他们的存在100%。不会引发警告或编译或运行时错误。 Card_Base.GetGrades会自动在表单加载时成功调用。
我也确认发布文件夹是空的并且未被使用。此外,我还有一个备份程序,当文件每次更改时都会上传到备份中,并显示一个图标。所以我100%确定bin \ debug是这种情况下正确的工作文件夹。
也许什么是最令人费解的是,我已经写了使用相同的IDE在同一台PC上的一个完全独立的程序,它正确地检索使用相同的设置路径。
在FileIO.cs
//public static string pathPortable = System.IO.Directory.GetCurrentDirectory();
public static string pathPortable = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
static string[] grade1;
public static string[] GetGrade()
{
string fullPath = FileIO.pathPortable + @"\Data";
grade1 = Directory.GetDirectories(fullPath);
return grade1;
}
在Card_Base.cs
public static List<RadioButton> buttonGrade = new List<RadioButton>(10);
public static void GetGrades()
{
string[] grade2 = FileIO.GetGrade();
//Proper and accurate names of the folders I manually added
//C:\Users\user\a\b\c\solution\bin\debug\Data\K
//C:\Users\user\a\b\c\solution\bin\debug\Data\1
//C:\Users\user\a\b\c\solution\bin\debug\Data\2
//C:\Users\user\a\b\c\solution\bin\debug\Data\3
MessageBox.Show("" + grade2[0]); //Information (entire path) is accurate as of this line
int x = 5;
int y = 0;
for (int i = 0; i < grade2.Count(); i++)
{
y = i * 21;
Card_Base.buttonGrade.Add(new RadioButton());
Card_Base.buttonGrade[i].Text = grade2[i];
MessageBox.Show("" + buttonGrade[i].Text); //Proper entire path is shown here!
Card_Base.buttonGrade[i].Location = new System.Drawing.Point(x, y);
}
}
控制其的.text属性其示出了C:\用户\用户,而不是宾\ Debug文件夹。
private void buttonTest_Click(object sender, EventArgs e)
{
MessageBox.Show("abc:" + buttonGrade[0].Text);
for (int i = 0; i < buttonGrade.Count(); i++)
{
panelGrade.Controls.Add(buttonGrade[i]);
}
MessageBox.Show("def:" + buttonGrade[0].Text); //Proper string path is displayed in the popup box here!
}
结果:??? 四形式面板上垂直排列单选按钮,所有有文本阅读“C:\用户\用户\”
UPDATE1: 文本也会出现稍微错位,比RADIOBUTTON气泡本身略高,很奇怪。但是,我已经回到编辑并确认panelGrade最初是空的。单击/拖动不捕捉任何东西,并右键单击面板不会在面板空间中显示任何基础对象。
将目标目录修改为其父级(高1级)后,每个messageBox检查点显示正在发送正确的字符串/路径。当“test”按钮被按下后,程序启动时的可见radioButton是这种不寻常的文字/字符串出现在任何地方的唯一情况。前
配售消息框/后测试按钮自身内的循环示出了控制(单选按钮在buttonGrade [0])DOES包含正确的串/文本/路径。因此,改变必须发生在buttonTest代码完成执行后的某个时间点。
UPDATE2: 我刚开了一个全新的解决方案和复制/粘贴相关代码消除任何多余的。将所有的项目/控件命名为相同的名称。完全裸露的骨头。完全相同的问题。
但是,当我将radioButtons更改为TextBox时...程序显示正确的信息。嗯。什么???
更新3: 寻找通过MSDN radioButtons派生自buttonBase。我一眼看到的唯一相关事件就是textChanged事件。虽然它注意到,像radioButton这样的派生类的文本属性的方式会有所不同,但它无法精确地指定它具有的限制或限制。 Control.Text只是一个System.String,因此我看不出为什么radioButton将无法包含这些信息。我试着创建'test2'按钮来改变'buttonGrade [0] .Text = FileIO.pathPortable;' 。奇怪的是,它并没有改变文字。它也不会抛出错误。
啊哈!我注意到用户之后的文件夹是我的谷歌驱动器,它是“谷歌驱动器”,并有一个空间。然后,我将垃圾程序复制到C:\并将其命名为TrashMe2,并确保没有包含空格的文件夹名称。结果是“C:\ TrashMe2 \ bi”。然后我尝试了“123456789”。结果是它显示到第二秒。
radioButton没有接收到不同的字符串,字符串/路径/数据从未改变。它只是显示了一个'不同的文件夹',因为那个'通过运气'是它显示的可见字符的确切数量。因为我以编程方式创建了radioButton,所以AutoSize没有默认为true。正确的字符串是radioButton的一部分,它不是全部可见的。
而出于安全原因(和一些幽默),我实际上打电话给我的用户帐户“用户”。所以这不是我会看到C:\ Users \ JoeNomidBlow被切断的场景。
我觉得......在这个特定的时刻很愚蠢。谢谢您的帮助!
您是否检查单选按钮文本是否未被其他控件占用?在浏览器中单击鼠标右键,然后检查元素以查看实际呈现给单选按钮的文本。 –
可以肯定的是,当你用'FileIO.pathPortable'替换'FileIO.pathPortable + @“\ Data”;'时会发生什么? ? – Rob
@Rob - 我做了调整,程序仍然有相同的最终结果。沿途的消息框正确显示新(较高位置)文件夹中的信息。在正在搜索的Debug文件夹内只有一个“Data”文件夹(正在运行主动调试的应用程序)。 – Branden