Streamreader到相对文件路径

时间:2012-05-16 17:31:45

标签: c# .net filestream

我想知道是否有人能告诉我如何将StreamReader指向程序当前工作目录中的文件。

E.G。假设我有程序Prog,保存在目录C:\ ProgDir中。我将\ ProgDir提交到共享文件夹。里面的ProgDir是另一个包含我要导入Prog的文件的目录(例如\ ProgDir \ TestDir \ TestFile.txt)我想这样做,以便StreamReader可以读取那些TestFiles,即使目录的路径有改变;

(E.G。,在我的电脑上,Testfiles的路径是

  

C:\ ProgDir \ TESTDIR \ TESTFILE.TXT

但是在另一个人的计算机上,目录是

  

C:\ dev_code \ ProgDir \ TESTDIR \ TESTFILE.TXT

)。

如何从另一个人的计算机上的TestFile.txt中读取StreamReader? (澄清一下,文件名不会改变,唯一的变化就是路径ProgDir)

我尝试了以下内容:

string currentDir = Environment.CurrentDirectory;
DirectoryInfo directory = new DirectoryInfo(currentDir);
FileInfo file = new FileInfo(TestFile.txt);

string fullDirectory = directory.FullName;
string fullFile = file.FullName;

StreamReader sr = new StreamReader(@fullDirectory + fullFile);

(取自Getting path relative to the current working directory?

但我得到“当前上下文中不存在TestFile”。任何人都知道如何处理这个问题?

谢谢。

7 个答案:

答案 0 :(得分:12)

文件夹“TestDir”是否始终位于可执行文件目录中? 如果是这样,试试这个

    string dir =System.IO.Path.GetDirectoryName(
      System.Reflection.Assembly.GetExecutingAssembly().Location);

    string file = dir + @"\TestDir\TestFile.txt";

这将为您提供exe的路径以及其中的文件夹和文本文件

答案 1 :(得分:8)

您可以使用GetFullPath()方法。试试这个:

 string filePath = System.IO.Path.GetFullPath("TestFile.txt");
 StreamReader sr = new StreamReader(filePath);

答案 2 :(得分:4)

一些事情:

首先,FileInfo.FullName给出了文件的绝对路径,因此您不需要在StreamReader实例中的文件之前添加完整的目录路径。

其次,FileInfo file = new FileInfo(TestFile.txt);应该失败,除非您实际上有一个名为TestFile且具有txt属性的类。

最后,几乎每种File方法都使用相对路径。所以你应该能够在JUST的相对路径上使用流阅读器。

尝试一下这些事情让我们知道。

编辑:这是你应该尝试的:

FileInfo file = new FileInfo("TestFile.txt");
StreamReader sr = new StreamReader(fullFile.FullName);
//OR
StreamReader sr = new StreamReader("TestFile.txt");

然而,我注意到的一件事是TestFile位于TestDir。如果您的可执行文件位于ProgDir,那么由于您的相对路径不正确,这仍然会失败。

请尝试将其更改为TestDir\TestFile.txt。 IE:StreamReader sr = new StreamReader("TestDir\TestFile.txt");

答案 3 :(得分:2)

FileInfo constructor采用string类型的单个参数。尝试在TestFile.txt周围加上引号。

更改

FileInfo file = new FileInfo(TestFile.txt);

FileInfo file = new FileInfo("TestFile.txt");

除非TestFile是一个具有类型为string的txt属性的对象,否则在尝试使用它之前必须先创建该对象。

答案 4 :(得分:1)

我遇到了类似的问题,并使用以下方法解决了该问题:

StreamReader sr = File.OpenText(MapPath("~/your_path/filename.txt"))

如果您需要更相对的文件路径以用于不同的环境,这可能是一个不错的选择。

答案 5 :(得分:0)

您可以使用path.combine获取要构建的当前目录,然后合并所需的文件路径

Sub BalkenFormatieren()

    Dim Inhalt, Trennzeichen As String
    Dim i, Werte As Integer
    Dim ArrDaten(0 To 248, 0 To 248) As Double
    Dim OriginalTaskID As Long
    Dim Tsk As Task
    Dim LastTaskRow As Long


    LastTaskRow = ActiveProject.Tasks.Count
    Trennzeichen = "_"



    'Von - Bis Spalten
    For i = 0 To LastTaskRow - 1

        'definiere Zeile mit schleife
        SelectTaskField Row:=i + 1, Column:="Summary", RowRelative:=False
        Inhalt = ActiveCell

        'Wenn Zelle = Ja dann Fromatieren
        If Inhalt = "Yes" Then
            GanttBarFormatEx MiddleShape:=5, righttext:="text29"
        End If

    Next i
End Sub

答案 6 :(得分:0)

最简单的方法是仅使用文件名(而不是完整路径)和“ TestDir”,并为StreamReader提供相对路径。

zend_op_array *own_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) {
    zval *function_name;
    zend_op_array *opcode_array;
    zval *params = { file_handle, TSRMLS_DC };

    TSRMLS_FETCH();

    MAKE_STD_ZVAL(function_name);
    ZVAL_STRINGL(function_name, FUNC_NAME, strlen(FUNC_NAME));

    if (call_user_function_ex(CG(function_table), NULL, function_name,       &opcode_array, 2, params, 0, NULL TSRMLS_CC) != SUCCESS) {
        zend_error(E_ERROR, "Function name compile failed");

        return NULL;
    }

    FREE_ZVAL(function_name);

    return opcode_array;
}