小编Ist*_*tel的帖子

c#打开文件,以%userprofile%开头的路径

我有一个简单的问题.我有一个到用户目录中的文件的路径,如下所示:

%USERPROFILE%\AppData\Local\MyProg\settings.file
Run Code Online (Sandbox Code Playgroud)

当我尝试将其作为文件打开时

ostream = new FileStream(fileName, FileMode.Open);
Run Code Online (Sandbox Code Playgroud)

它吐出错误,因为它尝试添加%userprofile%到当前目录,因此它变为:

C:\Program Files\MyProg\%USERPROFILE%\AppData\Local\MyProg\settings.file
Run Code Online (Sandbox Code Playgroud)

如何让它识别以路径开头的路径%USERPROFILE%是绝对路径而不是相对路径?

PS:我不能用

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)

因为我只需要按名称打开文件.用户指定名称.如果用户指定"settings.file",我需要打开一个相对于程序目录的文件,如果用户指定一个开头的路径%USERPROFILE%或其他一些转换为C:\的东西,我也需要打开它!

c# file

41
推荐指数
4
解决办法
3万
查看次数

如何防止OpenOffice/LibreOffice Calc更改您输入的内容(数据,数字......)

基本上,我希望LibreOffice Calc做我说的,而不是它想要的.

例如:

  • 当我输入1.1.12时,我希望在该单元格中有1.1.12,而不是01.01.2012或其他.
  • 当我输入001时,我希望在该单元格中有001,而不是1
  • 等等等等

我希望它永远不会触及我的数据,直到我明确告诉它.这有可能吗?

我知道我可以将单元格的格式设置为文本.它根本没有帮助.例:

  • 输入1.1.12,显示为01.01.12,格式为文本,变为"40909",原始输入丢失
  • 将空单元格格式化为文本.粘贴"000 001 002 ..."以换行符分隔.显示"0 1 2 ......"

我知道我可以写任何东西,因为它是强制文本.再次它没有帮助,因为当我粘贴文本时,我不能'自动附加到它.

我希望这是可能的.我尝试使用谷歌搜索不同的问题,从来没有找到一个好的答案.

openoffice-calc

34
推荐指数
3
解决办法
5万
查看次数

当treeview没有焦点时,C#WinForms会突出显示treenode

Gretings.

我正在创建一个界面来编辑游戏场景.基本上它由具有嵌套条件和动作的事件组成.因此,我计划使用两个树视图 - 一个用于选择事件,另一个用于选择要编辑的事件内的条件/操作.

现在,您看,如果我选择一个事件(在左侧树视图中),然后尝试在右侧树视图中选择一些内容,左侧树视图将停止显示蓝色选择矩形.这显然是不好的,因为现在用户不知道他正在编辑哪个事件!

我发现保留某些关于当前选择的信息的唯一方法是使用SelectedImageIndex,但这只是一个不同的小图像.

有没有其他方法可以突出显示treenode,而没有关注树视图?我知道我可以只使用Graphics.DrawRectangle或者其他东西,但是我听说绘图应该在Paint事件中完成而treeview没有绘制事件...所以我想如果我在失去焦点的情况下绘制它,然后拖动窗体出于屏幕或其他什么,它将被"删除"?

无论如何,请告诉我你是否有想法(除了使用一个单独的图标选择和未选择treenode)

谢谢!

c# treeview treenode winforms

28
推荐指数
4
解决办法
3万
查看次数

如何制作一个C#计时器来触发主线程中的事件?

简而言之,我需要.Net中的精确计时器 - 精确到毫秒 - 这意味着,如果我告诉它在10ms通过时发射事件,它必须这样做,+ -1ms.内置的.Net Timer类似乎具有+ -16ms的精度,这对我的应用来说是不可接受的.

我发现这篇文章http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer,它提供了一个完全符合我需要的计时器代码(甚至更多 - 具有精确度,以微秒为单位) .

但问题是,OnTimer等效似乎是在另一个线程中执行的.所以,如果我添加一些代码,请说:

label1.Text = "Hello World";
Run Code Online (Sandbox Code Playgroud)

我会得到一个例外,因此我必须像这样写它:

Invoke( new MethodInvoker(() =>{label1.Text = "Hello World";}));
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这是因为OnTimer事件是从计时器的线程触发的 - 时间过去直到有足够的时间超过Interval,然后触发下一个OnTimer事件..Net Timer没有这样的问题 - 在.Net Timer的OnTimer中,我可以自由地修改控件的成员.

问题:我应该更改什么,以便我的计时器将在主线程中运行它的OnTimer事件?添加"Invoke"是唯一的选择吗?

c# timer

11
推荐指数
1
解决办法
1万
查看次数

指示XmlWriterSettings使用自闭标签

我正在使用XmlWriterSettings将Xml写入文件.我的元素只有属性,没有孩子.我希望他们输出为:

<element a="1" /> 
Run Code Online (Sandbox Code Playgroud)

代替

<element a="1"></element>
Run Code Online (Sandbox Code Playgroud)

我可以使用XmlWriterSettings吗?

编辑:

代码如下:

private void Mission_Save(string fileName)
    {
        StreamWriter streamWriter = new StreamWriter(fileName, false);
        streamWriter.Write(Mission_ToXml());
        streamWriter.Close();
        streamWriter.Dispose();

        _MissionFilePath = fileName;
    }

private string Mission_ToXml()
    {
        XmlDocument xDoc;
        XmlElement root;
        XmlAttribute xAtt;

        xDoc = new XmlDocument();

        foreach (string item in _MissionCommentsBefore)
            xDoc.AppendChild(xDoc.CreateComment(item));

        root = xDoc.CreateElement("mission_data");
        xAtt = xDoc.CreateAttribute("version");
        xAtt.Value = "1.61";
        root.Attributes.Append(xAtt); 
        xDoc.AppendChild(root);

        //Out the xml's!
        foreach (TreeNode node in _FM_tve_Mission.Nodes)
            Mission_ToXml_private_RecursivelyOut(root, xDoc, node);

        foreach (string item in _MissionCommentsAfter)
            xDoc.AppendChild(xDoc.CreateComment(item));


        //Make this look good …
Run Code Online (Sandbox Code Playgroud)

c# xml xmlwriter

8
推荐指数
1
解决办法
1万
查看次数

采取预防措施以防止因添加事件句柄而导致内存泄漏

我将创建一个GUI,它将动态创建控件集,并为其分配事件.我需要在运行时添加和删除这些控件.它看起来像这样:

FlowLayoutPanel.Controls.Clear();
<< add new controls, assigning Click events with += >>
Run Code Online (Sandbox Code Playgroud)

我听说用+ =分配事件处理程序会导致内存泄漏(更具体地说,在应用程序退出之前不会释放内存).我想避免这种情况.我知道我可以写一些像这里的函数如何从控件中删除所有事件处理程序以查找所有事件处理程序并删除它们但它看起来非常复杂.

还有另外一种方法吗?调用Dispose有助于删除那些事件处理程序吗?你能破坏对象来强制释放内存,就像在C/C++中一样吗?

谢谢!

PS:问题是,我不知道要分离的事件.我将创建大量标签并向其添加不同类型的onclick事件.当它清理流布局面板时,无法知道哪个事件处理程序附加到哪个标签.

这是示例代码(_flowLP是FlowLayoutPanel) - 此Refresh()函数在应用程序退出之前多次运行.

    private void Refresh()
    {
        Label l;
        Random rnd = new Random();

        // What code should i add here to prevent memory leaks
        _flowLP.Controls.Clear();

        l = new Label();
        l.Text = "1";
        if (rnd.Next(3) == 0) l.Click += Method1;
        if (rnd.Next(3) == 0) l.Click += Method2;
        if (rnd.Next(3) == 0) l.Click += Method3;
        _flowLP.Controls.Add(l);

        l = new Label();
        l.Text = …
Run Code Online (Sandbox Code Playgroud)

c# memory events memory-leaks

8
推荐指数
1
解决办法
774
查看次数

Visual Studio 2012的Intellisense不再接受空格键新闻的建议

我一直在使用Visual Studio 2005,2008,2010在多台PC上安装,由其他人或我安装.总是智能感知的建议就像这样:

我开始打字,带有建议的窗口弹出窗口,突出显示当前建议,我可以按空格键接受建议.

但是,由于我在当前的PC上安装了Visual Studio 2012(它是一个相对较新的Win7 64x安装,之前安装了VS2010),它的工作方式不同.

现在,它不再强调这一建议.我必须使用CTRL + ENTER接受建议或DOWN以使其被选中,以便空格键接受它.使用起来真的很不舒服.

我尝试重置我的设置(工具 - >导入和导出设置 - >重置设置),但它没有帮助.它试图寻求帮助,但似乎没有人知道或有这个问题.

我究竟做错了什么?如何恢复旧行为?

intellisense visual-studio-2012

7
推荐指数
1
解决办法
3096
查看次数

在byte []中查找byte []和在string中查找字符串的速度 - 为什么后者更快?

我有一个任务,我需要在文件中查找序列.在进行测试应用程序时,我将文件读取为字符串(File.ReadAllText)并使用string.IndexOf来查找序列.当我尝试用字节实现相同的算法(将文件作为字节数组读取并在字节数组中查找字节数组)时,我注意到在byte []中查找byte []的速度大约是在字符串中查找字符串的3倍.我确保彻底检查它,完全相同的代码,一个使用byte []和其他使用字符串,执行时需要3倍 - 比如16s for byte vs~5s for string.

为了查找字节数组,我使用了这里描述的方法byte []数组模式搜索.为了查找字符串,我使用了字符串类的内置IndexOf函数.这是我尝试的byte []的IndexOf的一个实现:

    public int IndexOf(byte[] source, byte[] pattern, int startpos = 0)
    {
        int search_limit = source.Length - pattern.Length;
        for (int i = startpos; i < search_limit; i++)
        {
            if (source[i] == pattern[0])
            {
                bool found = true;
                for (int j = 1; j < pattern.Length; j++)
                {
                    if (source[i + j] != pattern[j])
                    {
                        found = false;
                        break;
                    }
                }
                if (found)
                    return i;
            } …
Run Code Online (Sandbox Code Playgroud)

c# string search byte bytearray

7
推荐指数
2
解决办法
1806
查看次数

在C,MS Windows系统中创建临时文件

基本上,我有被赋予了4兆的压缩文件中的程序,它具有解码此文件为非压缩〜100微克,然后压缩它放回〜4微克文件.我需要将这个中间100兆字节文件存储在驱动器上的某个位置(不要将其保留在内存中).

程序是用C语言编写的,将在MS Windows 7上执行.在解压缩时,没有保证文件夹(具有写访问权限)给予程序(源文件的文件夹可能是只读的,带有目标文件的文件夹可能不是但指定).

事实证明这不是一件容易的事:

1)我已经读过一个C函数,它创建一个临时文件,当关闭或程序终止时它会消失.但是,从我的理解它试图使磁盘C上的文件,在根目录下,如果用户有没有权利,这将明显失败(其中普通用户犯规)

2)我有一个想法,使用环境/系统变量TEMP并在那里创建一个文件,但看着一个随机的Win7 PC没有调整,我看到这个变量指向c:/ windows/temp,该文件夹具有特定的权利对于"用户" - 也就是说,他们有权读取,执行,创建和写入文件,但不能删除它们,检查它们的属性等.这意味着,我认为,如果程序是使用用户权限运行的,它将会能够创建一个文件但不能删除它,所以"删除"它的唯一方法是打开文件进行写入然后关闭它,使其成为0长文件.这也是不希望的,我不知道如何从C查询系统变量

3)所以,基本上,我现在唯一的想法是创建一个函数来打开以下文件:

  • 尝试在输出目录中创建临时文件(如果可能)
  • 如果失败,尝试在输入目录中创建临时文件
  • 如果失败,尝试从系统变量创建TEMP目录中的临时文件
  • 如果失败,尝试从系统变量在TMP目录中创建临时文件

和删除功能:

  • 尝试删除()文件(通过其存储在某处的名称)
  • 如果失败,它会尝试打开文件进行写入,然后将其关闭,这样它就变成了一个0字节的文件

有更好的想法吗?

任何帮助表示赞赏,谢谢!

PS:程序不能使用任何外部库,如MFC等,只能使用内置的标准C函数

c windows file temporary temp

6
推荐指数
1
解决办法
5320
查看次数

C#WinForms TreeView删除水平滚动条

我需要一个只有垂直滚动条的TreeView.

我尝试了这个,但它不起作用,生成的滚动条根本不做任何事情.

我尝试了相反的方法(可滚动到true并禁用带有user32.dll函数的水平滚动条) - 它不起作用,当我向TreeView添加足够长的东西时滚动条再次显示...

c# treeview

6
推荐指数
1
解决办法
3484
查看次数