我想知道是否有人能告诉我如何将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”。任何人都知道如何处理这个问题?
谢谢。
答案 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;
}