我有以下问题: 我有一个字符串变量,它必须存储文件路径。 在foreach循环中,我遍历某个目录中的所有文件,并查找最旧的,保存在该字符串变量中。 当循环完成后我尝试删除该文件,但是我收到一个错误: 使用未分配的局部变量。
以下是代码:
DateTime min = DateTime.Now;
string[] fileNames = Directory.GetFiles(somePath);
string fileDelete;
int countFiles = fileNames.Length;
if (countfiles > 5)
{
foreach (string someFile in fileNames)
{
FileInfo infoFile = new FileInfo(someFile);
if (infoFile.CreationTime <= min)
{
min = infoFile.CreationTime;
fileDelete = someFile;
}
}
File.Delete(fileDelete);
}
它说File.Delete(fileDelete)中的字符串fileDelete没有值, 但有趣的是,当我在开头给它一个值时就像那样:
string fileDelete = "blabla";
它完美无缺。 如果你想知道
,这只是一个方法的剪辑答案 0 :(得分:3)
在C#中你必须初始化变量,否则你可以将垃圾值传递给File.Delete。
我建议使用
string fileDelete = null; // or ""
然后检查一下。
if (!string.IsNullOrEmpty(fileDelete))
{
File.Delete(fileDelete);
}
答案 1 :(得分:1)
它完全符合预期。
在C#中,局部变量在声明时不会自动初始化。
在声明并且仅在循环中的某些条件下分配fileDelete
时,您并未向fileDelete
分配任何值。
但是你在循环中试图在这个条件之外使用它的值,因此编译器无法推断 - fileDelete
在运行时是否有某些值(如果条件下的代码不是执行 - 然后Widget&& var1 = Widget(); // rvalue reference
auto&& var2 = var1; //var2 not rvalue reference
没有价值)。
因此编译器会生成此错误。
答案 2 :(得分:0)
想象一下这种情况:
countFiles > 5
为True infoFile
someFile
大于min
传递给fileDelete
后,File.Delete
会有什么价值?
答案:在这种情况下,fileDelete
将被取消初始化,因此会显示错误消息。
答案 3 :(得分:0)
答案 4 :(得分:0)
使用此
DateTime min = DateTime.Now;
string[] fileNames = Directory.GetFiles(somePath);
string fileDelete;
int countFiles = fileNames.Length;
if (countfiles > 5)
{
foreach (string someFile in fileNames)
{
FileInfo infoFile = new FileInfo(someFile);
if (infoFile.CreationTime <= min)
{
min = infoFile.CreationTime;
fileDelete = someFile;
File.Delete(fileDelete);
}
}
}