我知道如何编码/解码一个简单的字符串到/从base64.
但是,如果数据已经写入FileStream对象,我该怎么做呢?假设我只能访问FileStream对象,而不能访问之前存储的原始数据.在将FileStream刷新到文件之前,如何将FileStream编码为base64.
在我将FileStream写入文件之后,我可以打开我的文件并对其进行编码/解码,但我想一步一步完成所有这一切,而不是一个接一个地执行两个文件操作.该文件可能更大,并且在刚刚保存一段时间后再加载,编码并再次保存它也需要两倍的时间.
也许有人认识一个更好的解决方案?我可以将FileStream转换为字符串,对字符串进行编码,然后将字符串转换回FileStream,例如,我将做什么以及这样的代码将如何?
在Visual Basic中,我只是On Error Resume Next在我的程序的头部编写,并且在整个项目中错误被抑制.
在C#中我非常想念这个功能.try-catch每个程序的常规处理不仅非常耗时,而且会带来不希望的影响.如果遇到错误,即使已处理,代码也不会从发生的那一刻开始继续.使用On Error Resume Next,代码从错误点继续,仅跳过导致错误的函数调用.
我还没有深入参与C#,但也许C#中存在比原语更好的错误处理try-catch.
我还想要出现错误的模块或函数名称以及错误消息中的行号.Exception据我所知,该课程没有提供这些功能.任何想法(当然,托管,不涉及我自己的应用程序上的任何流程类)?
你如何处理大项目中的错误?我希望我不必try-catch为每个方法添加一个.不知何故,C#抛出了许多错误 - 这似乎是该语言的典型特征.
我发现我的解决方案可以解决我的几个问题:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //setup global error handler
Application.Run(new Form1());
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show("Unhandled exception: " + e.Exception.ToString()); //get all error information with line and procedure call
Environment.Exit(e.Exception.GetHashCode()); …Run Code Online (Sandbox Code Playgroud) 我有两个表单,我的主要表单是Form1,我的辅助表单是按需显示的,因为对话框是Form2.现在,如果我调用Form2,它将始终显示在屏幕的左上角.我第一次认为我的表格根本不存在,但后来我看到它悬挂在屏幕的上方.我想在当前鼠标位置显示我的表单,用户单击上下文菜单以显示模式对话框.我已经尝试过不同的东西并搜索代码示例.但是我发现除了数以千计的不同代码之外什么也没有找到如何以我已经知道的不同方式获得实际的鼠标位置.但无论如何,这个位置总是相对于屏幕,主要形式,控制或任何当前上下文.在这里我的代码(我也尝试过的桌面定位不起作用,中心到屏幕只是表单的中心,所以我把属性留给了Windows.Default.Position):
Form2 frm2 = new Form2();
frm2.textBox1.Text = listView1.ToString();
frm2.textBox1.Tag = RenameFile;
DialogResult dlgres=frm2.ShowDialog(this);
frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y);
Run Code Online (Sandbox Code Playgroud) 是否有C#索引控制数组?我想设置一个"按钮数组",例如5个按钮,它们只使用一个事件处理程序来处理所有这5个控件的索引(就像VB6一样).另外,我必须为这5个按钮中的每个按钮写一个额外的事件处理程序.如果我有100个按钮,我需要100个事件处理程序?我的意思是这样的:
TextBox1[i].Text="Example";
Run Code Online (Sandbox Code Playgroud)
它可以使我更容易使用控制数组进行编码.现在我已经看到,C#至少在用户控件上没有可见的数组功能,在用户控件上没有"index"属性.所以我猜C#没有控制数组,或者我必须按已知名称调用每个元素.
我不得不在for循环100递增值中给出100个TextBox,而是写:
TextBox1.Text = Value1;
TextBox2.Text = Value2;
...
...
TextBox100.Text = Value100;
Run Code Online (Sandbox Code Playgroud)
还有很多工作+所有这100个事件处理程序,每个处理器额外增加一个TextBox.
我想要一个函数,它使用 c# 代码检索回收站中的文件名(在 win 7 上)。该框架似乎没有任何内容可以实现这一点。
Directory.Getfiles()对它不起作用,是吗?
我发现自己有一个使用“windows shell32 自动化”的代码,但这需要提供 interop.shell32.dll,它必须与我的应用程序一起重新分发。由于我的应用程序应该独立工作(只要用户计算机上存在 Net Framework 2),这个解决方案并不理想。这个解决方案对我来说似乎也不可靠,因为它使用 COM 自动化并且一些引用可能会失败或调用 Namespace(10) 可能会失败。我什至不确定 Namespace(10) 是否总是适合回收站的文件夹。这段代码是我在 C# 中找到的所有内容。
我在代码项目中找到了 Delphi 和另一个实现,但是如果我在我的 C# 项目中复制该代码,它实际上全是红色下划线,并且无法编译。我不确定如何更正此代码以使其在 C# 中使用。在 pinvoke.net 上,我没有找到我必须使用的 windows 函数的代码 (SHQueryRecycleBin),但也许我必须使用更多函数才能从回收站中获取文件列表。
有没有人看到代码或任何想法?
我试图弄清楚如何将字符"^"(不是CTRL命令)发送到外部文本窗口.
我尝试过这些不同的代码:
SendKeys.SendWait("^");
SendKeys.SendWait("(^)");
Sendkeys.SendWait("{^}"); //This should be the right code, but it doesn't work either
Run Code Online (Sandbox Code Playgroud)
这些都不会在文本字段中键入字符"^".如果我将正常文本发送到窗口,它将显示在窗口中."^"不能以某种方式输入.我查看了MSDN和联机帮助,但找不到任何接近该问题的内容.有任何想法吗?
我在C#Net 2.0 Windows Forms中有一个ListView,在应用程序启动时大约有十列填充了数据.数据量巨大,因此不能快速重新加载.我的ListView具有详细信息视图,允许用户单独调整每列的大小.
用户应能够一次隐藏十列或多列中的任何一列,并在非特定行中随时取消隐藏列.隐藏列时不应删除数据.
我尝试了以下的事情但结果并不令人满意:
1)调整大小为0的列的大小将使其稍微消失,直到用户开始使用列.用户会意外地将其重新调整大小,因为在我的ListView中,允许用户手动调整每列的大小.
2)只是删除列出现以下问题:当我尝试将列添加回来时,列不记得它的位置和大小.这个位置是主要问题,我将尝试解释原因.如果我的用户决定首先隐藏"第2列"然后"第3列"并且用户稍后在2之前取消隐藏3,则"索引2"不存在,因此我无法在第3号索引处插入并且异常上升.即使我在删除之前记住了索引位置,也不能简单地将列放回到该索引,因为我不知道以前的列是否已经隐藏过,或者哪些列在之前和之后丢失或隐藏或未隐藏.所以场景可能是这样的:1显示,2隐藏,3隐藏,4显示,5隐藏,6隐藏,7隐藏,8显示,9隐藏,10隐藏.
可能的解决方案"1)"和"2)"在场景中自动排除.更好的是甚至使列的宽度为零,但由于我的用户应该能够随时根据需要调整列的大小,并且调整大小为零,因此无法从用户隐藏.用户将通过调整大小取消隐藏它,我的系统会认为它仍然是隐藏的等等.如果隐藏的列可以只是"重新调整大小"或者我们如何命名其他内容,它看起来不专业.
有人有更好的主意吗?为什么listView列没有"可见"或"隐藏"属性,我想知道?如果之前有人这样做,请发布解决方案.
我必须补充一点,我在添加数据时使用listview中所有列的自动调整大小.因此,下面的答案不起作用.resize事件无法检测-1的宽度.添加数据时,将调整宽度为0的"所有不可见列"的大小.由于listview会删除与列长度重叠的数据,因此我需要永久自动化它.Explorer没有这个问题,因为它使列适合数据的长度.C#没有这样的高级列表视图,这里我每次添加数据时都要将列设置为-1.在这个概念中,用于隐藏列的column.width = 0的概念不起作用.
我有二进制文件,每次包含每个PNG文件(二进制文件不是DLL,不是EXE,没什么常见的,只是包含不同文本信息的文件,PNG文件和其他一些东西.格式文件对我来说是未知的.PNG文件可以显示一个执行此类文件的程序).我没有这个程序的来源做这些文件.我的任务是从二进制文件中提取此PNG文件以显示它或将其保存为PNG.我写了一个代码,它可以处理这些文件中的一部分(比如大约50%的文件),但不是.在不工作的文件上,创建此文件的程序仍然可以显示包含的图像,因此图像在每个文件内部确实有效 - 但无论如何我的代码对某些文件不起作用.
有些图像似乎可能有另一种格式,可能是编码类型(我已尝试过所有不同的编码类型,没有成功).这是我的代码(我希望有人可以告诉我改变什么,图像变得可读).
我的代码是什么:它找到PNG图像"‰PNG"的已知起始字符串和已知的结束字符串"IEND®B`".这个字符串在我的任何二进制文件中都包含PNG.然后我的代码获取开始和结束之间的字符串+开始和结束序列,并使用Encoding.Default将其保存到文件中.大多数通过这种方式提取的PNG文件可以使用图像查看器显示,但大约50%是无效的.如果我用编辑器打开它并将字符与工作图像进行比较,则图像看起来没问题.Sofar我不知道哪个符号是错误图像格式的原因.
如果需要我会提供更多信息,这里是我的代码:
private void button2_Click(object sender, EventArgs e)
{
string ReadFile1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "file.dat");
string WriteFile1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "test.png");
string TMP = File.ReadAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), ReadFile1), Encoding.Default); //System.Text.Encoding.GetEncoding(1251)
int start1 = TMP.IndexOf("PNG", 0 ,StringComparison.Ordinal);
if (start1 == 0) { return; }
int end1 = TMP.IndexOf("IEND", StringComparison.Ordinal);
string PNG = TMP.Substring(start1 - 1, (end1 + 9) - start1);
File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "test.png"), PNG, Encoding.Default);
}
Run Code Online (Sandbox Code Playgroud)
我还首先考虑使用二进制方法获取PNG并使用此代码,但我只是读取字符串时得到了完全相同的结果.这是我早期的代码.我使用字符串来搜索字节数组中的位置进行比较.我对二进制代码没有运气...
byte[] by;
// 1.
// Open file with a BinaryReader.
using (BinaryReader b = new …Run Code Online (Sandbox Code Playgroud) 我在C#2008系统Windows窗体的LargeIcon视图中有一个ListView.现在我想在同一个ListView中移动一个ListView项目在另一个位置 - 让我们称它为"拖放"或"项目重新排序"或其他什么.VB 6能够做到这一点,并在任何listView中自动执行此操作.
C#似乎没有此功能,或者需要先编码.为了编码,我没有经验,我在互联网上的研究中找不到任何答案.我发现只有一个"覆盖程序"没有用.
我不需要任何其他ListView控件(如ObjectListView或其他),我不需要覆盖过程或制作新的ListView控件.我想在Microsoft提供的ListView控件中处理它.对此有任何想法.代码将受到高度赞赏我相信我不能自己做,除非它是一个非常简单的单行.
PS:如果需要移动项目,我需要移动项目的所有属性(文本,标签,图像键,背景颜色,前景色,名称,工具文本等).我不知道如何实现这一目标.我发现了一个提示:它存在删除一个项目(称为.Remove())并插入一个名为.Insert()的插入.但是有了这些信息,我仍然无法通过鼠标"移动"物品.我认为listView的所有DragEvents都在这里发挥作用,但我不知道如何使用它们以及如何将所选项目(listView1.SelectedItems)复制到正确的位置并且需要首先获得此位置.
我是Visual C++的绝对新手,因此我不得不问你,如何在托管C++项目(Visual Studio 2008)中创建一个带有一个或多个函数的托管类模块(新类)?如果按下按钮,我将如何调用类的方法.我无法理解关于它的非常复杂的教程,大多数教程都涉及非托管代码或旧版Visual Studio.我自己的尝试完全失败并且只产生了错误,因为我没有找到关于如何向Visual C++托管项目添加新类文件的正确选项.如果我选择一个新的"CLR组件类",我会收到一条警告消息,告诉我填充屏幕右侧窗格的组件.如果我选择一个新的"CLR Windows Form Class",它什么都不会发生,没有添加扩展名为".class"的文件,或者我不知道新添加的文件.我只需要一个非常基本的类文件,其中包含一个公共函数,我可以从项目的任何位置调用它.
我有一个非常大的main()cpp文件(main.cpp),里面有很多函数.大约有几千个函数或更多函数,因此搜索或滚动变得困难.现在我想将这些1000个函数中的一些放在我当前项目中的第二个cpp文件中(在Visual Basic 6中,它简称为CSharp中的"新模块",它被称为"新类文件").问题是,一旦我将它们从main.cpp移到module1.cpp,我就无法在Visual C++中调用这个函数.
这就是我不想要的:
我知道有一种方法可以创建一个简单的类,然后创建一个这个类的新对象来使用它的方法.这就是我想要的.Google中关于此的示例对我不起作用,因为它们适用于Visual Studio的早期版本,与我的版本不兼容.从这个例子我知道我想要什么,但我没有在Visual Studio 2008中实现它的知识.
c# ×9
winforms ×3
file ×2
listview ×2
arrays ×1
base64 ×1
binary ×1
binary-data ×1
binaryfiles ×1
class ×1
clr ×1
columnheader ×1
filestream ×1
forms ×1
function ×1
hide ×1
list ×1
listviewitem ×1
managed ×1
png ×1
position ×1
recycle-bin ×1
sendkeys ×1
show ×1
string ×1
visual-c++ ×1