我正在编写一个显示项目列表的c#控制台应用程序。然后,用户可以浏览项目并适当地重绘屏幕以显示光标。这完全在IDE中运行,当我双击内置的.exe时。但是,当我通过命令行运行.exe时,所有内容均显示不正确。
//Display Current Directory, files and folders and selected file
public static void Display()
{
Console.Clear();
Console.CursorVisible = false;
//Sort and combine Directories and files
files = CombineArrays( currentPath );
Console.SetCursorPosition( 0, Console.WindowTop + 5 );
//Output all files and folders
for (int i = 0; i < files.Length; i++)
{
if (Cursor.cursorPosY == i)
{
FileAttributes attr = File.GetAttributes( files[i] );
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
writer.WriteLine( " -> > " + ShortenFileName( Path.GetFileNameWithoutExtension( files[i] ), 26 ) + Path.GetExtension( files[i] ) + "\\" );
}
else
{
writer.WriteLine( " -> {0,-40}{1,16}", ShortenFileName( Path.GetFileNameWithoutExtension( files[i] ), 26 )
+ Path.GetExtension( files[i] ), CalculateFileSize( files[i] ) );
}
}
else if (Cursor.cursorPosY != i)
{
FileAttributes attr = File.GetAttributes( files[i] );
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
writer.WriteLine( " > " + ShortenFileName( Path.GetFileNameWithoutExtension( files[i] ), 26 ) + Path.GetExtension( files[i] ) + "\\" );
}
else
{
writer.WriteLine( " {0,-40}{1,16}", ShortenFileName( Path.GetFileNameWithoutExtension( files[i] ), 26 )
+ Path.GetExtension( files[i] ), CalculateFileSize( files[i] ) );
}
}
}
writer.Flush();
Console.SetCursorPosition( 0, Cursor.cursorPosY );
//Clear top of window and Write Current Directory
ClearBlock( Console.WindowTop, Console.WindowTop + 5 );
Console.SetCursorPosition( 0, Console.WindowTop );
WriteCurrentPath();
}
-> Calling fileScout from command line
在文件数量未超过窗口高度的目录中,它会正确显示。但是,当列表大于窗口高度时,所有内容都会显示不正确,并且光标的行为也会异常。
这仅在通过命令行调用应用程序时发生。双击或通过IDE运行它(与双击相同)时不会。
为什么要在终端中运行的控制台应用程序的行为与从实际终端调用它和从文件资源管理器中运行它的行为有所不同?
powershell的问题相同。我也刚刚意识到它可以在ConEmu仿真cmd或powershell上正常工作。因此,该问题仅发生在普通Powershell和命令提示符中。
编辑:我也刚刚意识到问题是,当我调用Console.SetCursorPosition(...)时,它可以在IDE中工作,但不能在命令行中工作。我怀疑导致光标不改变的是罪魁祸首。