获取当前目录

本文关键字:取当前目录 | 更新日期: 2023-09-27 18:18:12

我一直在使用一个简单的程序,基本上是设计为数字闪存卡。理想情况下,我希望这个程序是可移植的。我正在尝试获取当前目录。我的设置是:

我有一个FileIO.cs方法读取currentDir/Data。然后我有一个winform,它调用该方法并检索文件夹列表的字符串[]数组。这两个方法都是公共静态的。然后我有一个单独的按钮来创建窗体上的控件。

问题:我已经清理/重建的解决方案,并一直使用调试器;程序从C:'Users'user'a'b'c'solution'bin'debug.我创建的用于验证此数据的控件(radioButton)告诉我"currentDir"是C:'Users'user,而不是程序的当前目录。

指出:我手动创建了Debug'Data和数据文件夹内的4个文件夹,所以我100%肯定它们存在。不会抛出任何警告或编译或运行时错误。Card_Base。GetGrades在表单加载成功时自动调用。

我也确认发布文件夹是空的,没有被使用。此外,我有一个备份程序,显示一个图标,当一个文件被上传到我的备份每次文件(s)的变化。所以我100%肯定bin'debug是在这种情况下正确的工作文件夹。

也许最让我困惑的是,我在同一台PC上使用相同的IDE编写了一个完全独立的程序,它使用相同的设置正确地检索路径。

在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:'Users'User,而不是Bin'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:'Users'user'"

Update1:文本看起来也有点不对齐,比radioButton气泡本身略高,非常奇怪。但是,我回到编辑器并确认panelGrade最初是空的。点击/拖动抓取不到任何东西,右键单击面板不会显示面板空间中的任何底层对象。

将目标目录修改为其父目录(高一级)后,每个messageBox检查点显示正在发送的正确字符串/路径。当程序启动时,在"测试"按钮被按下之后,可见的单选按钮是唯一出现这种不寻常的文本/字符串的地方。

在测试按钮本身的循环之前/之后放置messageBoxes显示控件(buttonGrade[0]中的radioButton)确实包含正确的字符串/文本/路径。因此,更改必须在buttonTest代码完成执行后的某个时刻发生。

更新2:我刚刚打开了一个全新的解决方案,并复制/粘贴了相关的代码,消除了任何无关的东西。用相同的名称命名所有项/控件。完全赤裸的骨架。同样的问题

然而,当我把radioButtons改成textboxes…程序显示正确的信息。嗯。什么? ?

更新3:通过MSDN查看radioButtons是从buttonBase派生的。我一眼看到的唯一相关事件是textChanged事件。虽然它确实注意到派生类(如radioButton)的文本属性的方式是不同的,但它没有确切地指定它如何或有什么限制。控制。文本只是一个系统。字符串,因此我看不出为什么一个radioButton不能包含该信息。

我尝试创建一个'test2'按钮来改变'buttonGrade[0]。Text = FileIO.pathPortable;奇怪的是,它完全不改变文本。也不会抛出错误。

啊哈!我注意到user后面的文件夹是我的google drive,它是"google drive",里面有一个空间。然后,我将我的垃圾程序复制到C:'并将其命名为TrashMe2,并确保文件夹名称不包含空格。结果是"C:'TrashMe2'bi"。然后我试了"1234567890123456789"。结果是它显示到第二个3。

radioButton没有接收到不同的字符串,字符串/path/data也没有改变。它只是显示了一个"不同的文件夹",因为幸运的是,它显示的正是可见字符的数量。因为我是通过编程方式创建radioButtons的,所以AutoSize没有默认为true。正确的字符串是radioButton的一部分,它只是不完全可见。

出于安全原因(和一点幽默),我实际上称我的用户帐户为"user"。所以这不是我看到C:'Users'JoeNomidBlow被切断的场景。

我觉得……在这个特殊的时刻很愚蠢。谢谢你的帮助!

获取当前目录

以编程方式添加控件,特别是radioButton,不会自动将autoSize属性设置为true。当以编程方式创建radioButton时,必须确保添加

radioButton.Autosize = true;

或者在这个例子中是/was

buttonGrade[i].Autosize = true;

否则将缩短文本的可见空间。在这种情况下,留下部分路径。这恰好是一个不同的有效路径