获取当前目录

时间:2015-10-19 03:25:09

标签: c# path directory filepath

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

我有一个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。

我还确认Release文件夹为空并且未被使用。此外,我有一个备份程序,每当文件更改时,文件上传到我的备份时会显示一个图标。所以我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:\ 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!
    }

结果:??? 表格面板上有四个垂直排列的radioButtons,它们都有文本阅读&#34; C:\ Users \ user \&#34;

UPDATE1: 文字也显得略微错位,略高于radioButton泡泡本身,非常奇怪。但是,我已经回到编辑器并确认panelGrade最初是空的。单击/拖动不会抓取任何内容,右键单击面板不会在面板的空间中显示任何基础对象。

将目标目录修改为其父目录(高1级)后,每个messageBox检查点显示正在发送正确的字符串/路径。当程序启动时,在&#34; test&#34;之后可见的radioButton。按下按钮是这个不寻常的文本/字符串出现在任何地方的唯一情况。

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

UPDATE2: 我刚刚开了一个全新的解决方案并复制/粘贴相关代码,消除了任何无关紧要的事情。命名具有相同名称的所有项目/控件。完全裸露的骨头。完全相同的问题。

但是,当我将radioButtons更改为TextBoxs时...程序会显示正确的信息。嗯。什么???

更新3: 查看MSDN radioButtons是从buttonBase派生的。我一眼就能看到的唯一相关事件是textChanged事件。虽然它确实注意到像radioButton这样的派生类的text属性的方式各不相同,但它无法准确指定它具有的限制方式或限制。 Control.Text只是一个System.String,因此我看不出为什么radioButton无法包含该信息。

我尝试创建一个&#39; test2&#39;按钮改变&#39; buttonGrade [0] .Text = FileIO.pathPortable;&#39; 。奇怪的是,它并没有改变所有文本。它也不会引发错误。

啊哈!我注意到用户之后的文件夹是我的谷歌硬盘,这是#34; Google Drive&#34;并且有一个空间。然后我将我的垃圾程序复制到C:\并命名为TrashMe2并确保没有文件夹名称包含空格。结果是&#34; C:\ TrashMe2 \ bi&#34;。然后我尝试了#34; 1234567890123456789&#34;。结果是它显示到第二个3。

radioButton没有收到不同的字符串,字符串/路径/数据从未改变过。它只显示了一个不同的文件夹&#39;因为那,通过抽奖的运气&#39;是它显示的可见字符的确切数量。因为我以编程方式创建了radioButtons,所以AutoSize并未默认为true。正确的字符串是radioButton的一部分,它根本不可见。

出于安全原因(以及一点幽默),我实际上是在呼叫我的用户帐户&#34;用户&#34;。所以我不会看到C:\ Users \ JoeNomidBlow被切断的情况。

我觉得......在这个特殊的时刻相当愚蠢。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

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

radioButton.Autosize = true;

或者这个案例是/是

buttonGrade[i].Autosize = true;

否则会缩短文本的可见空间。在这种情况下,留下部分路径。巧合的是,恰好与不同的有效路径相同。